【发布时间】:2020-12-22 02:55:57
【问题描述】:
我需要创建一个查询来连接两个表中的数据:
- [订单]
- [人物]
并给出以下输出:
- 销售人员 ID
- 全名
- 订单月份
- 月订单量
- 年订单量
这里的诀窍在于每年的订单量。虽然每月的订单量应按月份细分,但每个给定月份和销售人员的年度数量应相同。
我首先想到的是使用OVER (PARTITION BY <column x> ORDER BY <column y>)。
所以,我想出了这个查询:
SELECT
ORD.SalespersonPersonID,
PEO.FullName,
[Order Month] = MONTH(ORD.OrderDate),
[Monthly Amount of Orders] = COUNT(ORD.OrderID),
[Yearly Amount of Orders] = COUNT(ORD.OrderID) OVER (PARTITION BY ORD.SalespersonPersonID ORDER BY MONTH(ORD.OrderDate))
FROM [Sales].[Orders] ORD LEFT JOIN [Application].[People] PEO
ON ORD.SalespersonPersonID = PEO.PersonID
WHERE YEAR(ORD.OrderDate) = '2016'
GROUP BY ORD.SalespersonPersonID, PEO.FullName, MONTH(ORD.OrderDate), ORD.OrderID
ORDER BY PEO.FullName
问题是因为我必须在GROUP BY 中提及ORD.OrderID,它打破了每月聚合。
我采用了不同的方法并解决了这个问题(使用 CTE):
WITH table1 AS
(
SELECT
SalespersonPersonID,
[Yearly Amount of Orders] = COUNT(OrderID)
FROM [Sales].[Orders]
WHERE YEAR(OrderDate) = '2016'
GROUP BY SalespersonPersonID
)
SELECT
ORD.SalespersonPersonID,
PEO.FullName,
[Order Month] = MONTH(ORD.OrderDate),
[Monthly Amount of Orders] = COUNT(ORD.OrderID),
T1.[Yearly Amount of Orders]
FROM [Sales].[Orders] ORD
LEFT JOIN [Application].[People] PEO
ON ORD.SalespersonPersonID = PEO.PersonID
LEFT JOIN table1 AS T1
ON ORD.SalespersonPersonID = T1.SalespersonPersonID
WHERE YEAR(ORD.OrderDate) = '2016'
GROUP BY ORD.SalespersonPersonID, PEO.FullName, MONTH(ORD.OrderDate), T1.[Yearly Amount of Orders]
ORDER BY PEO.FullName
我仍然想知道如何使用OVER (PARTITION BY <column x> ORDER BY <column y>) 运行它。感觉这是解决这个问题的更优雅的方法。
谢谢,
迈克尔
【问题讨论】:
标签: sql group-by count sum window-functions