2011-11-01 39 views
1

我正在处理存储过程,我试图减小IF块的大小,并想知道是否可以根据参数确定GROUP BY子句。我会告诉你我是什么意思:我可以根据参数确定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块。

任何帮助表示赞赏 - 谢谢!

回答

6

可以情况下:但你也需要同样的表达在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 
+0

太棒了!谢谢gbn - 我现在就试试。 –

0

你可以使用动态SQL执行此操作的替代方案。

基本上你在组中擦肩而过的PARAMS然后像做

DECLARE @Query VARCHAR(MAX) 

SET @Query = 'SELECT something FROM whatever WHERE a = b GROUP BY '[email protected] 

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

有些人更喜欢这种方法,其他人觉得它可能有点混乱,这一切都取决于你的个人喜好和你需要做的。