Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL案例操作_Sql - Fatal编程技术网

SQL案例操作

SQL案例操作,sql,Sql,我是sql方面的新手,一直在尝试解决一个关于订单信息表的问题。在本例中,我尝试使用case操作获取订单的月度报告,因此我应该有一个列,其中说明年份,另一个列说明月份,然后我应该有第1-20天、21-22天、23-24天和25天以上的列。我试着使用案例操作来获取那些天发生的订单数量。 我尝试了以下查询: SELECT DATEPART(YEAR,date) AS year,DATEPART(MONTH,date) AS month, COUNT(CASE WHEN DAT

我是sql方面的新手,一直在尝试解决一个关于订单信息表的问题。在本例中,我尝试使用case操作获取订单的月度报告,因此我应该有一个列,其中说明年份,另一个列说明月份,然后我应该有第1-20天、21-22天、23-24天和25天以上的列。我试着使用案例操作来获取那些天发生的订单数量。 我尝试了以下查询:

SELECT 
    DATEPART(YEAR,date) AS year,DATEPART(MONTH,date) AS month,
        COUNT(CASE WHEN DATEPART(DAY,date) BETWEEN 1 AND 20 THEN order ELSE 0 END) AS D1_D20,
        COUNT(CASE WHEN DATEPART(DAY,date) BETWEEN 21 AND 22 THEN order ELSE 0 END) AS D21_D22,
        COUNT(CASE WHEN DATEPART(DAY,date) BETWEEN 23 AND 24 THEN order ELSE 0 END) AS D23_D24,
        COUNT(CASE WHEN DATEPART(DAY,date) > 25 THEN order ELSE 0 END) AS D25_END
FROM ORDERS
GROUP BY DATEPART(YEAR,date),DATEPART(MONTH,date)
显然,这个查询的问题是,现在我只得到每天的订单总数,我知道我应该计算订单,但不知道语法。非常感谢您的帮助

使用
SUM()

我建议使用函数
DAY()
YEAR()
MONTH()
,因为它们更易于键入

顺便说一下,如果删除
ELSE
子句,则可以使用
COUNT()。您的特殊问题是
COUNT(0)=COUNT(1)
,因为
COUNT()
计算非
NULL
值。我更喜欢
SUM()
,因为它在这方面更直观

SELECT 
    DATEPART(YEAR, date) AS year, DATEPART(MONTH, date) AS month,
        SUM(CASE WHEN DATEPART(DAY,date) BETWEEN 1 AND 20 THEN 1 ELSE 0 END) AS D1_D20,
        SUM(CASE WHEN DATEPART(DAY,date) BETWEEN 21 AND 22 THEN 1 ELSE 0 END) AS D21_D22,
        SUM(CASE WHEN DATEPART(DAY,date) BETWEEN 23 AND 24 THEN 1 ELSE 0 END) AS D23_D24,
        SUM(CASE WHEN DATEPART(DAY,date) > 25 THEN 1 ELSE 0 END) AS D25_END
FROM ORDERS
GROUP BY DATEPART(YEAR, date), DATEPART(MONTH, date);