首页 > 解决方案 > SQL 查询以在每个月的第一天到最后一天的列中显示每日计数结果

问题描述

需要一个查询来显示从每月的第一天到最后一天的列中客户购买的每件商品的每日计数

示例数据表“项目”

+--------+--------+----------+---------------+
| Purchase Date | Item Code| Item Name| Price|
|--------+--------+----------+--------------+
| 01-JAN-20     | 11       | Apple   | 1    |
| 01-JAN-20     | 11       | Apple   | 1    |
| 02-JAN-20     | 12       | Orange  | 2    |
| 02-JAN-20     | 11       | Apple   | 1    |
| 03-JAN-20     | 12       | Orange  | 2    |
| 03-JAN-20     | 12       | Orange  | 2    |
| 04-JAN-20     | 12       | Orange  | 2    |
| 04-JAN-20     | 11       | Apple   | 1    |
+--------+--------+----------+--------------+

SQL 查询应使用项目代码显示每日计数,结果如下表所示。每天计数,每一天都显示在当天的列中,例如,如果今天是 1 月 4 日,那么明天计数将创建具有计数结果的新列,并持续到月的最后一天或类似的东西。

+--------+--------+----------+---------------+
| Items  | Jan 01| Jan 02| Jan 03|Jan 04| etc
+--------+--------+----------+--------------+
| Apple  | 2     |   1   |   2   |   1  |
| Orange | 0     |   1   |   0   |   1  |
+--------+--------+----------+--------------+

标签: sqldatecountmultiple-columns

解决方案


如果你知道你想要什么日期,你可以使用条件聚合:

select item,
       sum(case when purchase_date = '2020-01-01' then 1 else 0 end) as jan_1,
       sum(case when purchase_date = '2020-01-02' then 1 else 0 end) as jan_2,
       sum(case when purchase_date = '2020-01-03' then 1 else 0 end) as jan_3,
       sum(case when purchase_date = '2020-01-04' then 1 else 0 end) as jan_4,
       . . .
from items
group by item;

请注意,这假定它purchase_date确实存储为内部日期格式。所以比较是一个日期常数——但是,这可能因数据库而异。

如果您没有记住一组特定的日期,那么您将需要使用动态 SQL。


推荐阅读