功能超过了SQL的1024列限制

时间:2012-09-23 23:15:45

标签: sql sql-server-2008 tsql reporting-services

参数:@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)

有什么建议吗?也许做一个临时表?我不太熟悉如何做到这一点,但我现在打算做一些研究。

感谢。

2 个答案:

答案 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