参数:@Year int, @Month int
环境:SQL Server 2008 R2,Visual Studio
根据所选的月份和年份,开发统计报告以查找每种代码类型(约50种以上)的6个月平均值。
因此,例如,如果选择2012年2月,则每次在2012年1月,12月/ 11月/ 10月/ 9月/ 8月出现代码类型时,查询将计算,然后将该总和除以6以获得过去6个月的平均值。实际平均值是在Visual Studio中的数据集中计算的。
SQL代码如下所示:
CASE WHEN TypeCode = "xyz" and [Year] = (@Year - 1) and [Month] in (12, 11, 10,
9, 8, 7) then 1 else 0 end as TypeXYZ_Jan_Avg,
CASE WHEN TypeCode = "xyz" and (([Year] = (@Year ) and [Month] = 1) OR
([Year] = @Year and [Month] in (12, 11, 10, 9, 8))
then 1 else 0 end as TypeXYZ_Feb_Avg,
CASE WHEN TypeCode = "xyz" and ([Year] = @Year and [Month] in (11, 10, 9, 8, 7,
6)) then 1 else 0 end as TypeXYZ_Dec_Avg
这是针对每50多种代码类型完成的。
我需要保留此功能中的其他字段(此处未提及)。无论如何,最终查询超过了允许的最大列数。
我尝试通过使代码类型成为参数来最小化字段数量。
这样的事情:
CASE WHEN TypeCode = @CodeType and ([Year] = @Year and [Month] in (11, 10, 9,
8, 7, 6)) then 1 else 0 end as Type_Dec_Avg
但是,当我在函数中声明@CodeType
参数时(由于我在VS中得到的多值错误),这不起作用:
SELECT * FROM CodeTypes(@CodeType, @Year, @Month)
传递值但计算结束:
SELECT * FROM CodeTypes(@Year, @Month) WHERE CodeType in (@CodeType)
有什么建议吗?也许做一个临时表?我不太熟悉如何做到这一点,但我现在打算做一些研究。
感谢。
答案 0 :(得分:1)
构建仅生成四列的查询:月,年,代码和值。我想你最终会发现这个查询更简单,并且Visual Studio也更容易处理。
答案 1 :(得分:0)
方式模糊,但让我试一试
select c1.codeType, sum(c2.sales)/6
from code c1
join code c2
on c2.codeType = c1.codeType
and DateDiff(mm, c1.date, c2.date) <= 6
group by c1.codeType