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
我想要的只是上面的 sum 函数返回从 2018 年 1 月到 2018 年 6 月的总和,并且我还想要上一年同期的总和。我不想对月份进行硬编码,但我更希望它是动态的。
我想过使用条件聚合函数,但输出与我的要求不匹配。有任何想法吗 ?
这是我想要的输出:https ://imgur.com/a/YtDgR8s
解决方案
您可以将过滤器添加到 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) 中说季度数。
推荐阅读
- vb.net - 运行参数查询时 SQL 执行错误
- string - gsub在lua中使用索引
- pyqt - 如何将变量从.ui文件发送到主python文件中的另一个.ui文件
- php - 验证表单 OOP
- angular - 角度和内容可编辑
- python - 寻找一种更有效/pythonic的方法来对列表中的元组求和,并计算平均值
- android - 如何使用python脚本访问手机摄像头
- javascript - 使用 javascript 从 json 创建选择输入
- javascript - 将 JSON.parse() 返回类型转换为对象数组
- python - Python - PyQt5 - 关闭第二个窗口而不关闭所有应用程序