使用AdventureWorks2014 db,我想要选择以下数据:对于每位客户,我希望从他的第一笔订单起,在12个月内完成所有订单。我结束了解决方案:SQL分组数据
WITH dates AS
(
SELECT soh.CustomerID
,MIN(soh.OrderDate) AS MinOrderDate
,DATEADD(MONTH, 12, MIN(soh.OrderDate)) as MaxOrderDate
FROM Sales.SalesOrderHeader soh
JOIN Sales.SalesOrderDetail sod ON sod.SalesOrderID=soh.SalesOrderID
GROUP BY soh.CustomerID
)
SELECT soh.CustomerID
,soh.OrderDate
,sod.ProductID
FROM Sales.SalesOrderHeader soh
JOIN Sales.SalesOrderDetail sod ON sod.SalesOrderID=soh.SalesOrderID
JOIN dates on dates.CustomerID=soh.CustomerID
WHERE soh.OrderDate BETWEEN MinOrderDate AND MaxOrderDate
ORDER BY soh.CustomerID
不知道这是否正确?我想知道是否有更简单的解决方案?
只是一个小小的评论 - 'soh。*'和'sod。*'不起作用,您需要指定列名称。无论如何,非常感谢您的答案,这是我不知道的东西:) – katta
@katta soh。*和sod。*,因为他们共享至少一个列名SalesOrderId它不会工作,但如果没有共同的列名它会工作的表之间。 – Matt
好了解,谢谢! – katta