SQL - Оператор множественного PIVOT не работает с псевдонимом - PullRequest
1 голос
/ 16 октября 2019

Тестовые данные:

CREATE table #user (ID INT)
insert into #user values (1)

CREATE table #type 
(
 subscriberId INT,
 typeId INT,
 typeValue NVARCHAR(256)
)
insert into #type values (1,1,'Type1')
insert into #type values (1,2,'Type2')
insert into #type values (1,3,'Type3')

CREATE table #category
(
 subscriberId INT,
 categoryId INT,
 categoryValue NVARCHAR(256)
)
insert into #category values (1,1,'Category1')
insert into #category values (1,4,'Category4')
insert into #category values (1,5,'Category5')
insert into #category values (1,6,'Category6')

У меня есть запрос, который отлично работает

SELECT * FROM (
SELECT t.subscriberId,
    t.typeId, t.typeValue,
    c.categoryId, c.categoryValue
    FROM #user u
    INNER JOIN #type t on t.subscriberId = u.id
    INNER JOIN #category c on c.subscriberId = u.id) target
PIVOT(
    max(typeValue)
    for typeId in ([1],[2],[3])
) as [pivot_table1]
PIVOT (
    max(categoryValue)
    for categoryId in ([4],[5],[6])
) as [pivot_table2]

Но когда я пытаюсь использовать одинаковые идентификаторы для categoryId и typeId:

for categoryId in ([1],[4],[5],[6])

Я вижу ошибку:

Сообщение 265, уровень 16, состояние 1, строка 38 Имя столбца «1», указанное в операторе PIVOT, конфликтует с существующим именем столбца в PIVOTаргумент. Msg 8156, Уровень 16, Состояние 1, Строка 39 Столбец '1' был указан несколько раз для 'pivot_table2'.

Кроме того, я не могу использовать [pivot_table1].[1]] вместо *, но этовозможно, когда я использую только один оператор PIVOT. У кого-нибудь есть идеи как это исправить? Ожидаемый результат: Как я могу использовать один и тот же идентификатор (имя столбца) в обоих PIVOT?

Ответы [ 2 ]

2 голосов
/ 16 октября 2019

Если ответ от PeterHe предоставляет правильный набор возвращаемых данных, тогда (как уже упоминалось) кросс-таблица будет выглядеть лучше:

SELECT U.ID,
       MAX(CASE t.typeId WHEN 1 THEN t.typeValue END) AS [1],
       MAX(CASE t.typeId WHEN 2 THEN t.typeValue END) AS [2],
       MAX(CASE t.typeId WHEN 3 THEN t.typeValue END) AS [3],
       MAX(CASE c.categoryId WHEN 1 THEN c.categoryValue END) AS c_1,
       MAX(CASE c.categoryId WHEN 2 THEN c.categoryValue END) AS c_2, --Assumed wanted
       MAX(CASE c.categoryId WHEN 3 THEN c.categoryValue END) AS c_3, --Assumed wanted
       MAX(CASE c.categoryId WHEN 4 THEN c.categoryValue END) AS c_4,
       MAX(CASE c.categoryId WHEN 5 THEN c.categoryValue END) AS c_5,
       MAX(CASE c.categoryId WHEN 6 THEN c.categoryValue END) AS c_6
FROM #user u
     JOIN #type t ON u.ID = t.subscriberId
     JOIN #category c ON t.subscriberId = c.subscriberId
GROUP BY u.ID;
2 голосов
/ 16 октября 2019

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

SELECT * FROM (
SELECT t.subscriberId,
    t.typeId, t.typeValue,
    N'c_'+CAST(c.categoryId as nvarchar(22)) AS categoryId, c.categoryValue
    FROM #user u
    INNER JOIN #type t on t.subscriberId = u.id
    INNER JOIN #category c on c.subscriberId = u.id) target
PIVOT(
    max(typeValue)
    for typeId in ([1],[2],[3])
) as [pivot_table1]
PIVOT (
    max(categoryValue)
    for categoryId in (c_1, c_4, c_5, c_6)
) as [pivot_table2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...