2016-12-13 6 views
2

Я пытаюсь перенести столбец текста и значений в строки заголовков. Я исследовал функцию PIVOT и UNPIVOT, но эта функция зависит от агрегации от того, что я собрал. Ниже я заинтересован в достижении.SQL Транспонирование столбцов в строки

Источник Таблица схемы:

[ID] [Category] [TextName] 
     1   A   u 
     1   B   v 
     1   C   w 
     2   A   x 
     2   B   y 
     2   C   z 

В результате транспонирования:

[ID] [A] [B] [C] 
    1  u  v  w 
    2  x  y  z 

Возможно ли это?

+0

Какие СУБД вы используете? MySQL? SQL Server? Oracle? Это имеет значение. – CGritton

+0

Кроме того, даже если функции 'pivot' и' univot' полагаются на агрегацию, вы можете использовать 'min()' или 'first()' в качестве своих агрегатных функций. Не имея числовых значений, необязательно означает, что вы не можете использовать эти функции. – CGritton

+0

SQL Server ... должен был упомянуть об этом. Благодаря! – b135i11

ответ

1
SELECT id, 
     MIN(CASE WHEN Category = 'A' THEN TextName END) AS A, 
     MIN(CASE WHEN Category = 'B' THEN TextName END) AS B, 
     MIN(CASE WHEN Category = 'C' THEN TextName END) AS C 
    FROM Table 
GROUP BY id; 
+0

спасибо! это работает для меня – b135i11

1

Это все еще своего рода агрегация, даже если у нас есть одно значение для каждой ячейки (комбинация строк и столбцов).
Min/Max даст вам нужные значения, так как любой базовый тип, включая строки, имеет определение Min/Max.

select * 
from t pivot (min([TextName]) for [Category] in (A,B,C)) p  

+----+---+---+---+ 
| ID | A | B | C | 
+----+---+---+---+ 
| 1 | u | v | w | 
+----+---+---+---+ 
| 2 | x | y | z | 
+----+---+---+---+ 
+0

Могу ли я спросить, почему вы не приняли этот ответ? Это намного проще, и это именно то, что вы искали. –

+0

Он работал для большей части того, что я искал. Однако с точки зрения производительности я нашел предложение Теджи быстрее. Кроме того, мне также понадобилось предложение GROUP BY – b135i11

+0

1. У вас улучшена производительность ваших реальных данных с помощью GROUP BY? 2. Зачем вам предложение GROUP BY? –