我仔细阅读了许多示例,并加入了几个示例,以得出以下结论:
DECLARE @StartDate SMALLDATETIME, @EndDate SMALLDATETIME; SELECT @StartDate = '20170930', @EndDate = '20180930'; ;WITH d(d) AS ( SELECT DATEADD(MONTH, n, DATEADD(MONTH, DATEDIFF(MONTH, 0, @StartDate), 0)) FROM ( SELECT TOP (DATEDIFF(MONTH, @StartDate, @EndDate) + 1) n = ROW_NUMBER() OVER (ORDER BY [object_id]) - 1 FROM sys.all_objects ORDER BY [object_id] ) AS n ) SELECT [Period] = CONVERT(VARCHAR(4), YEAR(d.d)) + '-' + CONVERT(VARCHAR(2), MONTH(d.d)), QtyTotal = ISNULL(SUM(o.QEXIT),0) FROM d LEFT OUTER JOIN VE_STOCKTRANS AS o ON o.TRANSDATE >= d.d AND o.TRANSDATE < DATEADD(MONTH, 1, d.d) WHERE STOCKID = 6000 AND TRANSTYPE = 3553 GROUP BY d.d ORDER BY d.d;
我需要获取过去一年中某项商品的总销售质量。如果该商品在该特定月份没有任何销售,则该月旁边应显示0。除非提供WHERE子句,否则上面的查询将执行所需的操作。一旦添加WHERE子句以获取特定产品的数据,就没有销售的月份消失了。
如果有经验的SQL开发人员可以向我显示正确的方向,我将不胜感激。
谢谢
您需要将条件移至ON:
ON
-- ... SELECT [Period] = CONVERT(VARCHAR(4),YEAR(d.d)) +'-'+ CONVERT(VARCHAR(2), MONTH(d.d)), QtyTotal = ISNULL(SUM(o.QEXIT),0) FROM d LEFT OUTER JOIN VE_STOCKTRANS AS o ON o.TRANSDATE >= d.d AND o.TRANSDATE < DATEADD(MONTH, 1, d.d) AND STOCKID = 6000 AND TRANSTYPE = 3553 -- here GROUP BY d.d ORDER BY d.d;