Могу ли я определить предложение GROUP BY на основе параметра? - PullRequest
1 голос
/ 01 ноября 2011

Я работаю над хранимой процедурой и пытаюсь уменьшить размер блоков 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 ]

6 голосов
/ 01 ноября 2011

Вы можете 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
0 голосов
/ 01 ноября 2011

В качестве альтернативы вы можете сделать это с помощью динамического sql.

В основном вы передаете в группу параметры, а затем делаете что-то вроде

DECLARE @Query VARCHAR(MAX)

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

Затем используйте sp_executeSql для запускаquerystring.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...