2014-12-03 4 views
-1

я следующая выборку из таблицыSQL-Транспонирование строк в столбец

+-------------+---+------------------+--+ 
| Heading1 | 2 | 3    | | 
+-------------+---+------------------+--+ 
| Cats  | d | 1    | | 
| Cats  | e | 13/01/2000 12:29 | | 
| Dogs  | s | 1    | | 
| Dogs  | e | 13/01/2000 12:29 | | 
| Frogs  | d | 1    | | 
| Frogs  | e | 13/01/2000 12:29 | | 
| Cows  | d | 1    | | 
| Cows  | e | 13/01/2000 12:29 | | 
+-------------+---+------------------+--+ 

Я хотел бы строку столбца 2, чтобы быть различными заголовками и содержу строку для каждого уникального значения от 1 до 3 Aand, представленного как это :

+-----------+------+------------------+------+ 
| Headings: | d |  e   | s | 
+-----------+------+------------------+------+ 
| Cats  | 1 | 13/01/2000 12:29 | Null | 
| Dogs  | Null | 13/01/2000 12:29 | 1 | 
| Frogs  | 1 | 13/01/2000 12:29 | Null | 
| Cows  | 1 | 13/01/2000 12:29 | Null | 
+-----------+------+------------------+------+ 

Любые идеи гугле его и потерял волю с этим одним :)

EDIT: что я не упомянул, был тот факт, что становится столбцы является динамической, т.е. в этом КАС e d, e, s и может быть чем угодно, действительно оцените ответы.

Спасибо Все

ответ

1

Вы можете транспонировать rows to columns в два пути

Метод 1:Conditional Aggregate

SQL FIDDLE DEMO

SELECT Heading1, 
     Max(CASE WHEN [2] = 'd' THEN [3] END) 'd', 
     Max(CASE WHEN [2] = 'e' THEN [3] END) 'e', 
     Max(CASE WHEN [2] = 's' THEN [3] END) 's' 
FROM <tablename> 
GROUP BY Heading1 

Метод 2:Pivot

SQL FIDDLE DEMO

SELECT * 
FROM (SELECT * 
     FROM <tablename>) a 
     PIVOT (Max([3]) 
      FOR [2] IN ([d], 
         [e], 
         [s])) piv 
-1

Что вы ищете называется PIVOT. Он позволяет преобразовывать строки в столбцы.

-1
SELECT Heading1, 
    (SELECT Heading3 FROM Table2 b WHERE a.Heading1 = b.Heading1 and b.Heading2 = 'd') as d, 
    (SELECT Heading3 FROM Table2 b WHERE a.Heading1 = b.Heading1 and b.Heading2 = 'e') as e, 
    (SELECT Heading3 FROM Table2 b WHERE a.Heading1 = b.Heading1 and b.Heading2 = 's') as s 
INTO Table2 
FROM Table1 a 
GROUP BY Heading1 
+0

Почему downvote, когда запрос делает именно то, что нужно? – CrimsonKing