Как сделать строки в качестве заголовков на SQL Server - PullRequest
1 голос
/ 01 мая 2019

У меня есть таблица, как показано ниже

    -------------------------------------
   | Date      | EventName | Occurrences|
   --------------------------------------
   | 4/30/2019 | Party     | 20         |
   | 4/30/2019 | Reunion   | 10         |
   | 4/30/2019 | Auction   | 5          |
   | 4/30/2019 | Party     | 10         |
   | 4/30/2019 | Reunion   | 10         |
   --------------------------------------

Если я выполняю запрос, подобный этому

SELECT Date, EventName, SUM(Occurrences)
FROM [dbo].[Mytable]
GROUP BY Date, EventName
ORDER BY Date DESC

, я получаю результат, подобный этому ...

   | Date      | EventName | Occurrences|
   --------------------------------------
   | 4/30/2019 | Party     | 30         |
   | 4/30/2019 | Reunion   | 20         |
   | 4/30/2019 | Auction   | 5          |

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

   | Date      | Party     | Reunion    | Auction |
   ------------------------------------------------
   | 4/30/2019 | 30        | 20         |    5    |

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

Ответы [ 2 ]

1 голос
/ 01 мая 2019

В языке SQL существует очень строгое правило , согласно которому вы должны знать количество и типы столбцов в результатах на основе только схемы, , прежде чем запрос начнет выполняться . То, что вы просите, неизвестно до тех пор, пока запрос не начнет проверять данные.

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

Это также возможно при использовании динамического SQL , при котором вы выполняете запрос в три этапа: сначала запустите запрос, чтобы получить имена столбцов, которые вам понадобятся. Во-вторых, используйте эту информацию для построения новой строки запроса с необходимыми столбцами. В-третьих, выполните новую строку запроса. Dynamic is sql опасен и медленен, и его следует использовать только тогда, когда это абсолютно необходимо.

В большинстве случаев правильным ответом здесь является вариант 3: поворот данных в клиентской программе или инструменте отчетности . Запустите запрос, который у вас уже есть, и позвольте потребителю данных беспокоиться об остальном. Причина, по которой это трудно, сводится к формальной теории реляционных множеств. То, что вы просите сделать, это не только вне традиционной теории множеств, но и в прямой противоположности тому, как наилучшим образом использовать отношения, и поэтому разработчики языка ядра СУБД неохотно создают простой синтаксис для этих операций.

1 голос
/ 01 мая 2019

Вы можете попробовать использовать агрегатную функцию условия, CASE WHEN с SUM

SELECT Date, 
    SUM(CASE WHEN EventName = 'Party' THEN Occurrences ELSE 0 END) Party,
    SUM(CASE WHEN EventName = 'Reunion' THEN Occurrences ELSE 0 END) Reunion,
    SUM(CASE WHEN EventName = 'Auction' THEN Occurrences ELSE 0 END) Auction
FROM [dbo].[Mytable]
GROUP BY Date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...