我可以根据参数确定GROUP BY子句吗?

时间:2011-11-01 15:24:33

标签: sql sql-server sql-server-2008

我正在处理存储过程,我正在尝试减小IF块的大小,并想知道是否可以根据参数确定GROUP BY子句。我会告诉你我的意思:

这不是SQL代码,而是写成我想要实现的内容......

SELECT...

GROUP BY
IF @groupBy = 0
    DATEPART(yy, MyDBDateField)
ELSEIF @groupBy = 1
    DATEPART(yy, MyDBDateField),
    DATEPART(m, MyDBDateField)
ELSE
    DATEPART(yy, MyDBDateField),
    DATEPART(m, MyDBDateField),
    DATEPART(d, MyDBDateField)

所以,我正在尝试按年份,月份或日期对数据进行分组,具体取决于参数。听起来很简单,但看起来我必须将语句复制粘贴到IF块中。

感谢任何帮助 - 谢谢!

2 个答案:

答案 0 :(得分:6)

你可以CASE它:但你也需要在SELECT中使用相同的表达式

SELECT
   ...,
   DATEPART(yy, MyDBDateField),
   CASE WHEN @groupBy = 1 THEN DATEPART(m, MyDBDateField) ELSE NULL END,
   CASE WHEN @groupBy = 2 THEN DATEPART(d, MyDBDateField) ELSE NULL END
FROM



GROUP BY
   DATEPART(yy, MyDBDateField),
   CASE WHEN @groupBy = 1 THEN DATEPART(m, MyDBDateField) ELSE NULL END,
   CASE WHEN @groupBy = 2 THEN DATEPART(d, MyDBDateField) ELSE NULL  END

答案 1 :(得分:0)

作为替代方案,您可以使用动态sql执行此操作。

基本上你通过params传递组,然后执行类似

的操作
DECLARE @Query VARCHAR(MAX)

SET @Query = 'SELECT something FROM whatever WHERE a = b GROUP BY '+@GroupByParam

然后使用sp_executeSql来运行查询字符串。

有些人更喜欢这种做法,有些人认为这有点混乱,这完全取决于你的个人偏好以及你需要做什么。