如何在使用分组集时计算列

时间:2014-07-16 02:43:00

标签: 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 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语句创建一些不同的列,但最终看起来,每行只知道当前日期的每月总和和年度总和,我似乎无法跳过去获得前几年的总和。

任何想法?

谢谢!

1 个答案:

答案 0 :(得分:0)

下面的查询可以做你想要的,你只需检查 转换 中的数据类型(因为我不知道你使用的是哪种数据类型所以我假设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)
                 )