SQL Server:对今年和去年的特定列求和

SQL Server:对今年和去年的特定列求和,sql,sql-server,Sql,Sql Server,我想要的是上面的sum函数返回2018年1月到2018年6月的sum,我还想要上一年同一时间段的sum。我不想硬编码的月份,但我宁愿它动态 我曾想过使用条件聚合函数,但输出与我的要求不匹配。有什么想法吗 这就是我想要的输出:您可以在where子句中添加一个过滤器,将时间维度限制为当前和上一年,然后在SELECT列表和GROUP BY中添加类似的内容: SELECT a.ERSDataValues_ERSCommodity_ID,c.ersGeographyDimension_countr

我想要的是上面的sum函数返回2018年1月到2018年6月的sum,我还想要上一年同一时间段的sum。我不想硬编码的月份,但我宁愿它动态

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


这就是我想要的输出:

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

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
它可能看起来有点不同,这取决于你如何定义今年和上一年,但这就是想法


就限制1月至6月而言,这必须在WHERE条款中。如果您不想硬编码特定月份(1/6月),那么我认为您必须引用时间维度中的其他内容-例如,如果您有quarter属性,则可以在(1,2)中说出quarter_数字。

您会得到什么错误?这不是错误,但不是我想要的输出。-在ANSI-92 SQL标准中(超过25年前),用正确的ANSI
JOIN
语法替换了老式的逗号分隔表列表样式不鼓励使用它。表中没有名为date的列。名称可能不同-我指的是“时间存储日期”属性中的列。@BharatRadhakrishnan请提供DDL+DML,这意味着创建表的查询,包括索引和插入样本数据的查询。这将为我们提供重现问题和测试解决方案的工具。@Ronenariley数据很敏感,但我可以给出DDL。我如何连接到这里。嗨@BharatRadhakrishnan,我不熟悉这里的接口。在其他论坛中,您可以简单地添加缺少信息的回复,但在这里您只能添加不好的评论(明文)或答案。我看到的选项是(1)在回答消息中添加代码:坏主意,因为这不是答案,(2)在原始消息中添加代码:糟糕的主意,因为它会使所有评论变得无关,并且下一个来到这个线程的人不会理解我们所说的内容,因为问题已更改(3)在外部站点中添加信息并给我们链接;我认为这是不允许的
CASE 
WHEN YEAR(b.date)=YEAR(GETDATE()) THEN 'Current Year' 
WHEN YEAR(b.date)=YEAR(GETDATE())-1 THEN 'Previous Year'
ELSE NULL
END