Может ли SQL Server Pivot не знать имена столбцов? - PullRequest
12 голосов
/ 31 января 2010

У меня есть таблица, которая выглядит следующим образом:

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

И я хочу получить двумерную таблицу, которая дает мне «Val» для месяца каждого сайта, например:

Month      Microsoft      Google
2009-12        10           20
2009-11        12           21
2009-10        13           22

Но загвоздка в том, что я не знаю всех возможных значений, которые могут быть в «Сайте».Если появляется новый сайт, я хочу автоматически получить новый столбец в моей результирующей таблице.

Все примеры кода, которые я видел, которые могли это сделать, требовали от меня жесткого кода «Microsoft и Google» в тексте запроса.1009 * Я видел тот, который не , но в основном он притворялся, перечисляя сайты и генерируя запрос на лету (конкатинируя строку), в котором были указаны имена столбцов.1013 * Разве нет способа заставить SQL Server 2008 делать это без такого взлома?

ПРИМЕЧАНИЕ. Мне нужно иметь возможность запускать этот запрос как запрос, отправляемый из ASP.Net.не может выполнять хранимые процедуры или другие подобные вещи.

Спасибо!
Даниэль

Ответы [ 2 ]

6 голосов
/ 31 января 2010

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

Если данные не слишком велики, возможно, проще всего просто выполнить обычный запрос строки из ASP.NET и выполнить поворот в коде приложения. Если данные очень большие, вам придется динамически генерировать SQL после первого запроса возможных значений столбца.

Обратите внимание, что на самом деле вам не нужно писать оператор SQL, который генерирует динамический SQL; Вы можете просто сгенерировать SQL в ASP.NET, и это, скорее всего, будет намного проще. Просто не забудьте экранировать отличительные значения Site перед тем, как их сгенерировать в сгенерированном запросе, и не забудьте параметризовать те части SQL-выражения, которые вы обычно делаете без сводной.

0 голосов
/ 29 июня 2013

выберите месяц, мин (случай, когда 'microsoft'hen val end) microsoft, min (случай, когда сайт 'google'then val end) извне сгруппировать по месяцам

 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...