SQL Server условно сгруппирован по - PullRequest
4 голосов
/ 05 августа 2011

Разорение моей вишни stackoverflow.com!

У меня есть таблица SQL Server 2008, которая содержит десять столбцов nchar (1). Я пытался написать сохраненный процесс для запроса таблицы, чтобы получить счетчики, сгруппированные по любой комбинации из десяти столбцов. Например, скажем, у меня есть эти строки в таблице:

| COL1 | COL2 | COL3 | COL4 | COL5 | COL6 | COL7 | COL8 | COL9 | COL10
+======+======+======+======+======+======+======+======+======+======
|  T   |  P   |  9   |  C   |  )   |  N   |  N   |  S   |  X   |  X   
|  T   |  P   |  9   |  7   |  0   |  *   |  N   |  Q   |  X   |  X   
|  T   |  P   |  I   |  B   |  (   |  H   |  N   |  S   |  X   |  X   
|  T   |  P   |  A   |  A   |  G   |  S   |  N   |  6   |  X   |  X   

Я хочу иметь возможность группировать по столбцам 1 и 3 и получить:

COUNT | COL1 | COL2 | COL3 | COL4 | COL5 | COL6 | COL7 | COL8 | COL9 | COL10
+=====+======+======+======+======+======+======+======+======+=============
|   2 |  T   |  -   |  9   |  -   |  -   |  -   |  -   |  -   |  -   |  -   
|   1 |  T   |  -   |  A   |  -   |  -   |  -   |  -   |  -   |  -   |  -   
|   1 |  T   |  -   |  I   |  -   |  -   |  -   |  -   |  -   |  -   |  -   

Или я хочу иметь возможность группировать по столбцам 1, 2 и 8 и получить:

COUNT | COL1 | COL2 | COL3 | COL4 | COL5 | COL6 | COL7 | COL8 | COL9 | COL10
+=====+======+======+======+======+======+======+======+======+=============
|   2 |  T   |  P   |  -   |  -   |  -   |  -   |  -   |  S   |  -   |  -   
|   1 |  T   |  P   |  -   |  -   |  -   |  -   |  -   |  6   |  -   |  -   
|   1 |  T   |  P   |  -   |  -   |  -   |  -   |  -   |  Q   |  -   |  -   

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

(Постарайтесь не расстраивать меня слишком сильно, если я не следовал этикету stackoverflow.com. Пожалуйста, просто укажите на это, и я постараюсь сделать лучше в следующий раз.)

1 Ответ

5 голосов
/ 05 августа 2011
CREATE PROCEDURE GetGroups (
  @Col1 bit,
  @Col2 bit,
  @Col3 bit,
  @Col4 bit,
  @Col5 bit,
  @Col6 bit,
  @Col7 bit,
  @Col8 bit,
  @Col9 bit,
  @Col10 bit
)
AS
SELECT
  COUNT = COUNT(*),
  CASE @col1  WHEN 1 THEN COL1  END COL1,
  CASE @col2  WHEN 1 THEN COL2  END COL2,
  CASE @col3  WHEN 1 THEN COL3  END COL3,
  CASE @col4  WHEN 1 THEN COL4  END COL4,
  CASE @col5  WHEN 1 THEN COL5  END COL5,
  CASE @col6  WHEN 1 THEN COL6  END COL6,
  CASE @col7  WHEN 1 THEN COL7  END COL7,
  CASE @col8  WHEN 1 THEN COL8  END COL8,
  CASE @col9  WHEN 1 THEN COL9  END COL9,
  CASE @col10 WHEN 1 THEN COL10 END COL10
FROM YourTable
GROUP BY
  CASE @col1  WHEN 1 THEN COL1  END,
  CASE @col2  WHEN 1 THEN COL2  END,
  CASE @col3  WHEN 1 THEN COL3  END,
  CASE @col4  WHEN 1 THEN COL4  END,
  CASE @col5  WHEN 1 THEN COL5  END,
  CASE @col6  WHEN 1 THEN COL6  END,
  CASE @col7  WHEN 1 THEN COL7  END,
  CASE @col8  WHEN 1 THEN COL8  END,
  CASE @col9  WHEN 1 THEN COL9  END,
  CASE @col10 WHEN 1 THEN COL10 END

ОБНОВЛЕНИЕ

Кстати, поскольку результирующий запрос не создается динамически, вы можете реализовать его как табличную функцию:

CREATE FUNCTION fnGetGroups (
  @Col1 bit,
  @Col2 bit,
  @Col3 bit,
  @Col4 bit,
  @Col5 bit,
  @Col6 bit,
  @Col7 bit,
  @Col8 bit,
  @Col9 bit,
  @Col10 bit
)
RETURNS TABLE
AS
RETURN (
  SELECT
  …
)

и вызовите его вместо этого из SP:

CREATE PROCEDURE GetGroups (
  @Col1 bit,
  @Col2 bit,
  @Col3 bit,
  @Col4 bit,
  @Col5 bit,
  @Col6 bit,
  @Col7 bit,
  @Col8 bit,
  @Col9 bit,
  @Col10 bit
)
AS
SELECT *
FROM fnGetGroups(@Col1, @Col2, @Col3, @Col4, @Col5,
                 @Col6, @Col7, @Col8, @Col9, @Col10)

Дело в том, что TVF может быть удобнее использовать в различных сценариях SQL, в то время как SP может быть предпочтительнее для вызова непосредственно из приложения..

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