每月数据分组查询

时间:2020-05-24 13:59:41

标签: sql-server

我的表顺序中包含字段ID,部门,日期和金额。 我想要查询返回过去3个月或6个月部门总交易记录和总金额的记录的查询。如果任何月份都没有交易,我希望0作为总交易和金额。

我尝试了几次查询,但由于需要两个分组依据而无法生成输出。

这是我尝试过的东西。

Select SUM(ISNULL(od.Amount,0)) as Points, Count(ISNULL(od.OrderId,0)) as Transactions,
DATEPART(MONTH, od.OrderDate) as Month, max(DeptId)
from POR_OrderDetails od
where 
cast(od.OrderDate as date) BETWEEN cast(dateadd(month, -3, GETDATE()) as date) and cast(getdate() as date) 
group by DATEPART(YEAR, od.OrderDate),DATEPART(MONTH, od.OrderDate), od.DeptId

测试数据

+---------+--------+--------+-----------+
| OrderId | Amount | DeptId | OrderDate |
+---------+--------+--------+-----------+
| 1       | 10     | 1      | 15/3/2020 |
+---------+--------+--------+-----------+
| 2       | 10     | 3      | 1/3/2020  |
|         |        |        |           |
+---------+--------+--------+-----------+
| 3       | 10     | 2      | 25/2/2020 |
+---------+--------+--------+-----------+
| 4       | 20     | 1      | 1/2/2020  |
+---------+--------+--------+-----------+

预期产量

+-------+-------------+-------------------+--------+
| Month | TotalAmount | TotalTransactions | DeptId |
+-------+-------------+-------------------+--------+
| 1     | 0           | 0                 | 1      |
+-------+-------------+-------------------+--------+
| 1     | 0           | 0                 | 2      |
+-------+-------------+-------------------+--------+
| 1     | 0           | 0                 | 3      |
+-------+-------------+-------------------+--------+
| 2     | 20          | 1                 | 1      |
+-------+-------------+-------------------+--------+
| 2     | 10          | 1                 | 2      |
+-------+-------------+-------------------+--------+
| 2     | 0           | 0                 | 3      |
+-------+-------------+-------------------+--------+
| 3     | 10          | 1                 | 1      |
+-------+-------------+-------------------+--------+
| 3     | 0           | 0                 | 2      |
+-------+-------------+-------------------+--------+
| 3     | 10          | 1                 | 3      |
+-------+-------------+-------------------+--------+

1 个答案:

答案 0 :(得分:1)

首先,我建议创建一个Calendar Table,因为这会有所帮助,并且它们是任何实例的宝贵补充。

设置完成后,就很简单,只需将部门表(我假设您已经拥有)交叉连接到日历表,然后将LEFT JOIN插入部门订单表即可。像这样:

SELECT C.MonthNo,
       SUM(DOAmount) AS TotalAmount,
       COUNT(DOOrderID) AS TotalTransactions,
       D.DeptID
FROM dbo.Department D
     CROSS JOIN dbo.Calendar C
     LEFT JOIN dbo.DepartmentOrder DO ON D.DeptID = DO.DeptID
                                     AND C.CalendarDate = DO.OrderDate
WHERE C.CalendarDate >= '20200101'
  AND C.CalendarDate < '20200401'
GROUP BY C.MonthNo,
         D.DeptID
ORDER BY C.MonthNo,
         D.DeptID;