我的表顺序中包含字段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 |
+-------+-------------+-------------------+--------+
答案 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;