SQL Server, как объединить таблицу в «повернутом» формате (возвращая столбцы вместо строк)? - PullRequest
2 голосов
/ 30 апреля 2010

Извините за хромое название, у меня сегодня плохие навыки описания.

В двух словах, у меня есть запрос, подобный следующему:

SELECT P.LAST_NAME, P.FIRST_NAME, D.DEMO_GROUP
FROM PERSON P
JOIN PERSON_DEMOGRAPHIC PD ON PD.PERSON_ID = P.PERSON_ID
JOIN DEMOGRAPHIC D ON D.DEMOGRAPHIC_ID = PD.DEMOGRAPHIC_ID

Это возвращает результат, подобный этому:

LAST_NAME      FIRST_NAME     DEMO_GROUP
---------------------------------------------
Johnson        Bob            Male
Smith          Jane           Female
Smith          Jane           Teacher
Beeblebrox     Zaphod         Male
Beeblebrox     Zaphod         Alien
Beeblebrox     Zaphid         Politician

Я бы предпочел, чтобы результат был похож на следующее:

LAST_NAME      FIRST_NAME     Male           Female         Teacher        Alien          Politician
---------------------------------------------------------------------------------------------------------
Johnson        Bob            1              0              0              0              0
Smith          Jane           0              1              1              0              0
Beeblebrox     Zaphod         1              0              0              1              1

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

Да, это было бы тривиально сделать в коде.Но этот запрос является частью сложного набора хранимых процедур, представлений и служб отчетов, многие из которых находятся вне моей сферы влияния.Мне нужно произвести этот вывод в базе данных, чтобы избежать взлома системы.Есть идеи?

Кстати, это MS SQL Server 2005.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 30 апреля 2010

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

SELECT LAST_NAME, FIRST_NAME, [Male], [Female], [Alien], [Politician], [Teacher]
FROM 
(SELECT LAST_NAME, FIRST_NAME, DEMO_GROUP
FROM Person) p
PIVOT
(
COUNT (DEMO_GROUP)
FOR DEMO_GROUP IN
( [Male], [Female], [Alien], [Politician], [Teacher] )
) AS pvt
ORDER BY LAST_NAME
0 голосов
/ 30 апреля 2010

Если список возвращаемой Demo_Group известен заранее, вы можете сделать следующее:

SELECT P.LAST_NAME, P.FIRST_NAME
    , Sum( Case When Demo_Group = 'Male' Then 1 Else 0 End ) As Male
    , Sum( Case When Demo_Group = 'Female' Then 1 Else 0 End ) As Female
    , Sum( Case When Demo_Group = 'Teacher' Then 1 Else 0 End ) As Teacher
    , Sum( Case When Demo_Group = 'Alien' Then 1 Else 0 End ) As Alien
FROM PERSON P
    JOIN PERSON_DEMOGRAPHIC PD 
        ON PD.PERSON_ID = P.PERSON_ID
    JOIN DEMOGRAPHIC D 
        ON D.DEMOGRAPHIC_ID = PD.DEMOGRAPHIC_ID
Group By P.LAST_NAME, P.FIRST_NAME

Если список значений Demo_Group неизвестен, то есть вы хотите, чтобы столбцы генерировались динамически, то единственный способ сделать это - использовать нечеткий динамический SQL. Это не то, для чего был разработан SQL, и вместо этого его следует выполнять в инструментах среднего уровня или для создания отчетов.

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