SQL Server:汇总今年和去年的特定列

时间:2018-06-17 23:37:30

标签: sql 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

我想要的是上面的和函数从2018年1月到2018年6月返还总和,并且我想要同一时期的前一年的总和。我不想硬编码这几个月,但我宁愿动态地想要它。

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

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

1 个答案:

答案 0 :(得分:0)

您可以在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

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

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