我有一个使用分组集给我结果的查询:
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语句创建一些不同的列,但最终看起来,每行只知道当前日期的每月总和和年度总和,我似乎无法跳过去获得前几年的总和。
任何想法?
谢谢!
答案 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)
)