用于在各种DATE范围中检索SUM的SQL查询

时间:2013-05-15 14:53:22

标签: mysql sql date group-by

我有一张表格,其中包含有关已售产品,客户,购买日期和已售单位摘要的信息。

我想要获得的结果应该是4行,前三个是1月,2月和3月。最后一行是针对这3个月未售出的产品。

这是表格。 http://imageshack.us/a/img823/8731/fmlxv.jpg

表格列为:

id
sale_id
product_id
quantity
customer_id
payment_method_id
total_price
date
time

所以在结果中,第3行只是:

  • 1月,SUM为1月
  • 二月,SUM二月
  • 三月,SUM为MArch 下一行应该是4月份,但是4月份还没有项目,所以我真的不知道该怎么做。

编辑注释:基于链接的图像,上面的列将是2013年。

3 个答案:

答案 0 :(得分:6)

我会选择以下

SELECT SUM(totalprice), year(date), month(date) 
FROM sales
GROUP BY year(date), month(date)

答案 1 :(得分:1)

这个答案是基于我对你问题的这一部分的解释:

  
    

三月,MArch和下一行的SUM应该是四月,但是四月还没有项目,所以我真的不知道如何去做所有这些。

  

如果你想要获得一年的所有月份(比如说2013年),那么你需要有几个月的占位符,零销售。这将列出2013年的所有月份,即使他们没有销售:

SELECT m.monthnum, SUM(mytable.totalprice)
FROM (
  SELECT 1 AS monthnum, 'Jan' as monthname
  UNION SELECT  2, 'Feb'
  UNION SELECT  3, 'Mar'
  UNION SELECT  4, 'Apr'
  UNION SELECT  5, 'May'
  UNION SELECT  6, 'Jun'
  UNION SELECT  7, 'Jul'
  UNION SELECT  8, 'Aug'
  UNION SELECT  9, 'Sep'
  UNION SELECT 10, 'Oct'
  UNION SELECT 11, 'Nov'
  UNION SELECT 12, 'Dec') m
LEFT JOIN my_table ON m.monthnum = MONTH(mytable.date)
WHERE YEAR(mytable.date) = 2013
GROUP BY m.monthnum
ORDER BY m.monthnum

答案 2 :(得分:0)

如果我理解你的意思,你可以将逻辑放在case语句中并在group by中使用它:

select (case when month(date) = 1 then 'Jan'
             when month(date) = 2 then 'Feb'
             when month(date) = 3 then 'Mar'
             else 'Other'
        end) as period, sum(quantity) as sumquantity
from t
group by (case when month(date) = 1 then 'Jan'
             when month(date) = 2 then 'Feb'
             when month(date) = 3 then 'Mar'
             else 'Other'
        end)