Может ли 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'