【问题标题】:SQL query to retrieve SUM in various DATE ranges用于检索各种 DATE 范围内的 SUM 的 SQL 查询
【发布时间】:2013-05-10 05:16:48
【问题描述】:

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

我想要得到的结果应该是 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

因此,结果中的第 1 3 行将是:

  • 一月,一月的总和
  • 二月,二月的总和
  • 三月,三月的总和 下一行应该是四月的,但是四月还没有项目,所以我真的不知道该怎么做。

编者注:根据链接的图像,上面的列是 2013 年的。

【问题讨论】:

    标签: mysql sql date group-by


    【解决方案1】:

    我会选择以下

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

    【讨论】:

    • 非常感谢。我认为日期字段必须有一些方法,但我自己没有找到。非常感谢。
    【解决方案2】:

    此答案基于我对您问题的这一部分的解释:

    March,SUM for MArch,下一行应该是 April,但是 April 还没有项目,所以我真的不知道该怎么做。

    如果您要获取一年中的所有月份(例如 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
    

    【讨论】:

      【解决方案3】:

      如果我理解您的意思,您可以将逻辑放在 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)
      

      【讨论】:

      • 你不能用 datename(M, month(date)) 代替那种情况
      猜你喜欢
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-27
      • 2021-05-28
      • 1970-01-01
      相关资源
      最近更新 更多