0

参数:@Year int, @Month int

环境:SQL Server 2008 R2、Visual Studio

开发统计报告,根据所选月份和年份查找每种代码类型(约 50 多种类型)的 6 个月平均值。

因此,例如,如果选择 2012 年 2 月,则查询将在 2012 年 1 月、12 月/11 月/10 月/9 月/8 月 2011 年 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)

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

谢谢。

4

2 回答 2

1

构建一个只产生四列的查询:月、年、代码和值。我想你最终会发现这个查询更简单,而且 Visual Studio 也更容易处理。

于 2012-09-23T23:35:10.287 回答
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
于 2012-09-24T01:51:19.023 回答