2017-02-16 70 views
0

我已经看过这个问题(Please help merging 4 MySQL queries to One)希望它会有所帮助,但事实并非如此。我无法理解它,因为我的大脑被炸了。合并多个MySQL SELECT语句计算字段

我试图让我的头围绕合并四个SELECT语句,所有这些都单独工作到一个。

该字段是;

QUANTITY:INT;

ORDERDATE:DATE; //不是日期时间 - 我不需要时间。

MySQL版本5.6.17

我检索数据;

1)本财年订购的产品数量;

SELECT SUM(QUANTITY) AS YTD 
    FROM ORDERDETAILS 
    WHERE ORDERDATE BETWEEN "2016-07-01" AND "2017-02-16" 

注意,在澳大利亚的财政年度月1日通过到6月30日。

2)本月订购的产品数量;

SELECT SUM(QUANTITY) AS MONTHY 
    FROM ORDERDETAILS 
    WHERE ORDERDATE BETWEEN "2017-02-01" AND "2017-02-16" 

3)今天订购的产品数量;每顺序排序

SELECT SUM(QUANTITY) AS TODAYS 
    FROM ORDERDETAILS 
    WHERE ORDERDATE = "2017-02-16" 

4)的产物平均数;

SELECT AVG(QUANTITY) AS BOOGER 
    FROM ORDERDETAILS 
    WHERE ORDERDATE BETWEEN "2016-07-01" AND "2017-02-16" 

我想避免发送四个单独的语句到服务器。也许这是不可能完成的,但是如果我能在一个声明中达到同样的结果,我会很开心。

我已经看过连接,嵌入选择内选择,但不能让我的头围绕它。

一旦我得到数据,我所做的就是更新窗体上的几个标签(Delphi)。

任何提示,近55岁的大脑可以处理将不胜感激。

+0

将所期望的结果是什么样的?并参见http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-查询 – Strawberry

+0

@Strawberry所有我想要的是数字。现有的SELECT工作并产生一个我在屏幕上显示的数字。我想合并他们应该返回四个数字。我会检查发布的答案,看看它是否有效。谢谢你的评论。 –

回答

0

使用SUM(IF())模式和移动IF内部条件。

SELECT 
    SUM(IF(ORDERDATE BETWEEN "2016-07-01" AND "2017-02-16", QUANTITY, 0)) AS YTD, 
    SUM(IF(ORDERDATE BETWEEN "2017-02-01" AND "2017-02-16", QUANTITY, 0)) AS MONTHY, 
    SUM(IF(ORDERDATE = "2017-02-16", QUANTITY, 0)) AS TODAYS, 
    SUM(IF(ORDERDATE BETWEEN "2016-07-01" AND "2017-02-16", QUANTITY, 0))/COUNT(IF(ORDERDATE BETWEEN "2016-07-01" AND "2017-02-16", 1, NULL)) AS BOOGER 
FROM ORDERDETAILS 
WHERE ORDERDATE BETWEEN "2016-07-01" AND "2017-02-16"; 

考虑在今天的日期使用CURDATE()

还可以添加WHERE子句,以便不扫描表的所有行,例如,WHERE ORDERDATE BETWEEN "2016-07-01" AND "2017-02-16"FROM ORDERDETAILS

+0

谢谢,这工作完美。但是我对你在ORDERDETAILS之后添加WHERE的最终评论感到困惑。我已经这样做了,不是吗? –

+0

在我的回答中,我已经在SUM(IF())内移动了SUM的条件,并且查询工作正常。但是由于查询中没有WHERE子句,它将扫描表的所有行。如果你添加一个涵盖所有日期范围的WHERE子句,那么查询就可以正常工作,并且可以快一点。编辑我的答案以反映它。 – Sangharsh

+0

好的工作。实际上,当我测试它时,我添加了一个WHERE,并且在我的问题中提到了,所以我认为你的意思是别的。谢谢你的帮助。 :) –

1

您只需使用在不同的调用表中不同的别名,把它们都放在一个SELECT语句如下:

SELECT SUM(od1.QUANTITY) AS YTD, 
     SUM(od2.QUANTITY) AS MONTHLY, 
     SUM(od3.QUANTITY) AS TODAYS, 
     AVG(od4.QUANTITY) AS BOOGER 
FROM ORDERDETAILS od1, 
    ORDERDETAILS od2, 
    ORDERDETAILS od3, 
    ORDERDETAILS od4 
WHERE od1.ORDERDATE BETWEEN CAST('2016-07-01' AS DATE) AND CAST('2017-02-16' AS DATE) 
    AND od2.ORDERDATE BETWEEN CAST('2017-02-01' AS DATE) AND CAST('2017-02-16' AS DATE) 
    AND od3.ORDERDATE = CAST('2017-02-16' AS DATE) 
    AND od4.ORDERDATE BETWEEN CAST('2016-07-01' AS DATE) AND CAST('2017-02-16' AS DATE) 
+0

感谢您的回答。我刚刚在服务器上进行了测试,并且在3分钟后仍然运行。我可以看到你要去的地方,但它仍在运行查询。只有大约3000条记录。 :) –

+0

那是因为你不能像这样使用BETWEEN。您需要添加CAST('2016-07-01'AS DATE) –

+0

感谢您花时间回答,但我已经接受了另一个答案。希望你早点提到CAST,因为如果它有效的话,我会接受它的。 :) –

2

你可以做到这一点使用情况下,当条件:

select 
     sum(case when ORDERDATE BETWEEN '2016-07-01' AND '2017-02-16' then QUANTITY end) as YTD, 
     sum(case when ORDERDATE BETWEEN '2017-02-01' AND '2017-02-16' then QUANTITY end) as MONTHY, 
     sum(case when ORDERDATE = '2017-02-16' then QUANTITY end) as TODAYS, 
     AVG(case when ORDERDATE BETWEEN '2016-07-01' AND '2017-02-16' then QUANTITY end) as BOOGER 
     FROM ORDERDETAILS 
+0

谢谢,那也工作。似乎有几种方法可以实现同样的目标。尽管我已经接受了答案,对不起。 :) –