在上一篇文章中,我得到了增量销售的帮助。查询效果很好。我按产品添加了突破。我遇到的问题是我需要展示出售的新产品。如果该产品去年不存在,但我们今年正在销售它;那么它应该出现在数据表中。
我尝试在WHERE中使用CASE语句,但它导致了大量的数据重复。我在思考下面的内容。我如何处理仅包含当年的项目?感谢您的帮助,非常感谢。
不在哪里工作
WHERE
Ym.Project =
CASE
WHEN ymprev.Project IS NULL THEN ym.Project
ELSE ymprev.Project
END
以下是工作查询。
WITH ym as(
SELECT
Product
,SUM(Sales) AS Sales
,MONTH(Date) AS Month
,YEAR(Date) AS Year
FROM SalesTable
GROUP BY
YEAR(Date)
,MONTH(Date)
,Product
)
SELECT
ymprev.Project AS PrevProject
,ym.Product
,ym.Sales
,ymprev.Sales AS PreviousSales
,(ym.Sales - ymprev.Sales) AS IncrementalSales
,ymprev.Month AS PreviousMonth
,ymprev.Year AS PreviousYear
,ym.Month
,ym.Year
FROM ym
JOIN ym ymprev on
ymprev.Year = ym.Year
AND ymprev.Month = ym.Month
AND ymprev.Product = ym.Product
ORDER BY
ym.Year
,ym.Month
答案 0 :(得分:0)
您的查询隐式使用INNER JOIN
- 这意味着您只能看到两个数据集中匹配的值,就像您描述的那样。
尝试将FROM子句更改为
FROM ym
LEFT JOIN
ym ymprev on
ymprev.Year = ym.Year
AND ymprev.Month = ym.Month
AND ymprev.Product = ym.Product
您还需要在包含上一年查询中的数据元素的任何值中包含类似的逻辑。例如,,(ym.Sales - ymprev.Sales) AS IncrementalSales
将需要转换为,(ym.Sales - ISNULL(ymprev.Sales,0)) AS IncrementalSales
,否则它将为仅存在于当前年份的任何记录返回NULL。
您发布的查询未在CTE中包含Project
字段,因此我无法准确说明其工作原理,但发布的数据应该可以帮助您入门。