我正在处理存储过程,我正在尝试减小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块中。
感谢任何帮助 - 谢谢!
答案 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
来运行查询字符串。
有些人更喜欢这种做法,有些人认为这有点混乱,这完全取决于你的个人偏好以及你需要做什么。