Может ли SQL Server Pivot без знания итоговых имен столбцов?
У меня есть таблица, которая выглядит так:
Month Site Val
2009-12 Microsoft 10
2009-11 Microsoft 12
2009-10 Microsoft 13
2009-12 Google 20
2009-11 Google 21
2009-10 Google 22
И я хочу получить 2-мерную таблицу, которая дает мне "Val" для каждого месяца сайта, например:
Month Microsoft Google
2009-12 10 20
2009-11 12 21
2009-10 13 22
Но улов есть, я не знаю всех возможных значений, которые могут быть в "Сайте". Если появляется новый сайт, я хочу автоматически получить новый столбец в моей результирующей таблице.
Все образцы кода, которые я видел, которые могли бы это сделать, потребовали от меня жесткого кода "Microsoft и Google" в тексте запроса.
Я видел тот, который не сделал, но это было в основном подделкой его путем перечисления Сайтов и создания запроса "на лету" (объединение строки), которое были имена этих столбцов.
Нет ли способа заставить SQL Server 2008 сделать это без взлома?
ПРИМЕЧАНИЕ. Мне нужно иметь возможность запускать это как запрос, который я отправляю из ASP.Net, я не могу выполнять хранимые процедуры или другие подобные вещи.
Спасибо!
Daniel
Ответы
Ответ 1
В примере, к которому вы привязаны, используется динамический SQL. К сожалению, нет другого встроенного метода для поворота в SQL Server, когда выходные столбцы не известны заранее.
Если данные не слишком велики, возможно, проще всего просто запустить обычный запрос строки из ASP.NET и выполнить свою точку опоры в коде приложения. Если данные очень большие, вам придется генерировать SQL динамически после первого запроса возможных значений столбца.
Обратите внимание, что на самом деле вам не нужно писать инструкцию SQL, которая генерирует динамический SQL; вы можете просто генерировать SQL в ASP.NET, и это, скорее всего, будет намного проще. Только не забудьте, чтобы избежать различных Site
значения перед зажатия их в сгенерированном запросе, и не забудьте параметризировать остальные части заявления SQL, которые обычно были бы без поворота.
Ответ 2
выберите месяц,
мин (сайт случая, когда "microsoft", а затем конец val) microsoft, min (сайт случая, когда "google'then val end" ) google
из безлицензионного
группа по месяцам
select main.month,
m.val as microsoft,
g.val as google
from withoutpivot main
inner join withoutpivot m on m.month=main.month
inner join withoutpivot g on g.month=main.month
where m.site='microsoft'
and g.site='google'