2011-11-01 51 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來運行你的查詢字符串。

有些人更喜歡這種方法,其他人覺得它可能有點混亂,這一切都取決於你的個人喜好和你需要做的。