Sql server 2008 使用分组集时如何计算列

Sql server 2008 使用分组集时如何计算列,sql-server-2008,Sql Server 2008,我有一个查询,它使用分组集为我提供结果: Select store, product, FiscalMonth, FIscalYear, SUM(Amount), CASE WHEN FiscalMonth IS NULL THEN SUM(Amount) ELSE NULL END AS Total From Sales Group by store, product, Grouping

我有一个查询,它使用分组集为我提供结果:

 Select
       store,
       product,
       FiscalMonth,
       FIscalYear,
       SUM(Amount),
       CASE WHEN FiscalMonth IS NULL THEN SUM(Amount) ELSE NULL END AS Total
 From Sales
 Group by store, product, 
        Grouping Sets(
                      (FiscalYear, FiscalMonth, product),
                      (FiscalYear, product)
                     )
这给了我一组很好的结果,按FiscalMonth和FiscalYear分组:

Store      Product     FiscalMonth      FiscalYear     Amount       Total
1          123         NULL             2007           23.00        452.00
1          123         1/1/2007         2007           55.00        NULL
1          123         1/2/2007         2007           11.00        NULL
1          123         2/1/2007         2007           28.00        NULL
1          123         NULL             2008           28.00        552.00
1          123         3/1/2008         2008           99.00        NULL
1          123         4/1/2008         2008           36.00        NULL
1          123         4/2/2008         2008           55.00        NULL
1          123         4/3/2008         2008           89.00        NULL
我遇到的问题是,如何创建一个比较2007财年和2008财年的列,我希望增加一个列“Diff”,它=-100(452-552)

我试着用CASE语句创建一些不同的列,但似乎最终,每一行只知道当前日期的月和年的总和,我似乎不能跳转来获取前几年的总和

有什么想法吗


谢谢

下面的查询可以做您想做的事情,您只需在convert中检查数据类型(因为我不知道您使用的是哪种数据类型,所以我假设varchar(20)作为年份)。 我在isNUll()中得到上一年的总数,然后从当前总数中减去它,然后将结果乘以-100

Select
   store,
   product,
   FiscalMonth,
   FIscalYear,
   SUM(Amount),
   (-100 * ((ISNULL((SELECT SUM(Amount) FROM sales WHERE FiscalYear = CONVERT(VARCHAR(20),(CONVERT(INT, s.FiscalYear) - 1)) AND FiscalMonth IS NULL Group by FIscalYear),0) -  
 CASE WHEN FiscalMonth IS NULL THEN SUM(Amount) ELSE NULL END
 ))) as Diff

From Sales
Group by store, product, 
    Grouping Sets(
                  (FiscalYear, FiscalMonth, product),
                  (FiscalYear, product)
                 )

已发布查询中的列
SUM(Amount)
没有别名,但其相对位置与已发布输出中的
Amount
列的相对位置匹配,因此我假设这两个列是同一列。但是,为什么
Amount
Total
FiscalMonth
为空的行上有所不同?根据查询,我希望它们(在这些行上)相等,所以。。。我很困惑。在某种程度上,这与另一个问题有关,这个问题更接近你的问题:在哪一行
Diff
be-100?也许应该是新的一排吗?或者您希望当前正在生成的所有行的值都为-100?谢谢!我希望不必再次扫描数据进行另一次选择,但这似乎是唯一的方法。幸运的是,这次演出没有那么糟糕。我最终实现了一种你在这里拥有的形式。谢谢