[英]Monthly Data Query With Group by
我有帶有字段 id、部門、日期和金額的表格訂單。 我想要查詢返回部門總交易和總金額的最近 3 個月或 6 個月的記錄。 如果任何一個月都沒有交易,我希望 0 作為總交易和金額。
我嘗試了幾個查詢,但我無法生成 output 因為我想要兩組。
這是我嘗試過的東西。
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 |
+---------+--------+--------+-----------+
預計 Output
+-------+-------------+-------------------+--------+
| 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 |
+-------+-------------+-------------------+--------+
首先,我建議創建一個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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.