首页 > 解决方案 > SQL Server:对今年和去年的特定列求和

问题描述

SELECT
    a.ERSDataValues_ERSCommodity_ID,c.ersGeographyDimension_country,
    b.ERSTimeDimension_Year,
    SUM(a.ERSDataValues_AttributeValue) as Total
FROM
    cosd.ERSDataValues a, cosd.ERSTimeDimension_LU b,
    cosd.ERSGeographyDimension_LU c
WHERE
    a.ERSDataValues_ERSCommodity_ID IN (SELECT ERSBusinessLogic_InputDataSeries
                                        FROM [AnimalProductsCoSD].[CoSD].[ERSBusinessLogic]
                                        WHERE ERSBusinessLogic_InputGeographyDimensionID = 7493
                                          AND ERSBusinessLogic_InputTimeDimensionValue = 'all months'
                                          AND ERSBusinessLogic_Type = 'time aggregate')
  AND a.ERSDataValues_ERSTimeDimension_ID = b.ERSTimeDimension_ID
  AND c.ersGeographyDimension_country != 'WORLD'
  AND a.ERSDataValues_ERSGeography_ID = c.ERSGeographyDimension_ID                  
GROUP BY
    b.ERSTimeDimension_Year, a.ERSDataValues_ERSCommodity_ID,
    c.ersGeographyDimension_country
ORDER BY 
     b.ERSTimeDimension_Year, a.ERSDataValues_ERSCommodity_ID

我想要的只是上面的 sum 函数返回从 2018 年 1 月到 2018 年 6 月的总和,并且我还想要上一年同期的总和。我不想对月份进行硬编码,但我更希望它是动态的。

我想过使用条件聚合函数,但输出与我的要求不匹配。有任何想法吗 ?

这是我想要的输出:https ://imgur.com/a/YtDgR8s

标签: sqlsql-server

解决方案


您可以将过滤器添加到 where 子句以将时间维度限制为当前和上一年,然后将类似这样的内容添加到 SELECT 列表和 GROUP BY:

CASE 
WHEN YEAR(b.date)=YEAR(GETDATE()) THEN 'Current Year' 
WHEN YEAR(b.date)=YEAR(GETDATE())-1 THEN 'Previous Year'
ELSE NULL
END

根据您定义当前和上一年的方式,它可能看起来有点不同,但这就是想法。

就限制一月到六月而言,这必须在 WHERE 子句中。如果您不想对特定月份(1 月/6 月)进行硬编码,那么我认为您必须从时间维度中引用其他内容 - 例如,如果您有季度属性,您可以在 (1,2) 中说季度数。


推荐阅读