2011-11-01 2 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 запустить строку запроса.

Некоторые люди предпочитают такой подход, другие считают, что это может быть немного грязно, все зависит от ваших личных предпочтений и того, что вам нужно делать.

Смежные вопросы