【发布时间】:2015-02-10 16:18:16
【问题描述】:
我不太擅长 SQL 查询,但我尝试写这个:
SELECT DATEPART(YY,Orders.OrderDate) as Year,
DATEPART(MM,Orders.OrderDate) as Month,
(SUM(case when OrderDetails.ProductCode = 'XXX' then
OrderDetails.ProductPrice else 0 end) + SUM(Orders.Total))
AS XXX
FROM Orders
LEFT JOIN OrderDetails ON Orders.OrderID = OrderDetails.OrderID
WHERE Orders.OrderStatus = 'Shipped'
GROUP BY DATEPART(MM,Orders.OrderDate), DATEPART(YY,Orders.OrderDate)
ORDER BY DATEPART(YY,Orders.OrderDate),DATEPART(MM,Orders.OrderDate)
OrderDetails 通过字段OrderID 链接到Orders 表。在这个SELECT 查询中,我试图在OrderDetails.ProductCode 为XXX 时获取OrderDetails.ProductPrice 的总和,并将其添加到Orders.Total 以获得每个月/年的总金额。
除了一个问题(这可能是业余错误或已解决多次)之外,该查询正在运行。执行LEFT JOIN 时,OrderDetails 表可以有多个记录链接到Orders 表,这会在SUM(Orders.Total) 中抛出错误的结果。我已经隔离了这个问题,我似乎无法解决它。
谁能指出我正确的方向?
【问题讨论】:
-
旁注:在
GROUP BY/ORDER BY中使用DATEPART(...)将阻止优化器使用索引来完成查询的该部分,可能会使其非常慢。如果您可以改为创建可以加入的范围表(类似于我所做的in this answer,尽管您需要使用递归查询来创建范围),您应该能够进行索引可回答的比较。
标签: sql select sql-server-2005 group-by left-join