当前年份和去年之间的SQL差异。如果去年数据不存在包括当前年份

时间:2014-05-15 16:49:22

标签: sql

在上一篇文章中,我得到了增量销售的帮助。查询效果很好。我按产品添加了突破。我遇到的问题是我需要展示出售的新产品。如果该产品去年不存在,但我们今年正在销售它;那么它应该出现在数据表中。

我尝试在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

1 个答案:

答案 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字段,因此我无法准确说明其工作原理,但发布的数据应该可以帮助您入门。