2012-12-19 21 views
9

Mam tabeli jak tenMysql Konwersja do wiersza (kolumny tabeli przestawnej)

+---+-----+----+----+----+----+ 
|id |month|col1|col2|col3|col4| 
+---+-----+----+----+----+----+ 
|101|Jan |A |B |NULL|B | 
+---+-----+----+----+----+----+ 
|102|feb |C |A |G |E | 
+---+-----+----+----+----+----+ 

A następnie Chcę utworzyć raport jak ten

+----+---+---+ 
|desc|jan|feb| 
+----+---+---+ 
|col1|A |C | 
+----+---+---+ 
|col2|B |A | 
+----+---+---+ 
|col3|0 |G | 
+----+---+---+ 
|Col4|B |E | 
+----+---+---+ 

Czy ktoś może pomóc?

+0

Witamy w stackoverflow. [To jest bardzo częste pytanie] (http://stackoverflow.com/search?q= [mysql] + pivot). Poświęć kilka minut na przeszukanie archiwów. Spróbuj najpierw dopasować jedną z poprzednich odpowiedzi. Następnie, jeśli napotkasz problemy, opublikuj zapytanie i wszelkie błędy tutaj. – Leigh

+0

możliwy duplikat [wiersza przestawnego MySQL do dynamicznej liczby kolumn] (http://stackoverflow.com/questions/12004603/mysql-pivot-row-into-dynamic-number-of-columns) – RichardTheKiwi

Odpowiedz

28

Najpierw należy rozpakować dane, a następnie je przestawić. Ale niestety MySQL nie ma tych funkcji, więc będziesz musiał je replikować za pomocą zapytania UNION ALL dla funkcji unpivot i agregatu z CASE dla osi przestawnej.

UNPIVOT lub UNION ALL kawałek bierze dane z col1, col2, etc i zamienia ją w wielu wierszach:

select id, month, col1 value, 'col1' descrip 
from yourtable 
union all 
select id, month, col2 value, 'col2' descrip 
from yourtable 
union all 
select id, month, col3 value, 'col3' descrip 
from yourtable 
union all 
select id, month, col4 value, 'col4' descrip 
from yourtable 

Zobacz SQL Fiddle with Demo.

Wynik:

| ID | MONTH | VALUE | DESCRIP | 
---------------------------------- 
| 101 | Jan |  A | col1 | 
| 102 | feb |  C | col1 | 
| 101 | Jan |  B | col2 | 
| 102 | feb |  A | col2 | 
| 101 | Jan | (null) | col3 | 
| 102 | feb |  G | col3 | 
| 101 | Jan |  B | col4 | 
| 102 | feb |  E | col4 | 

Następnie owinąć to w podkwerendzie stosować kruszywo a CASE do konwersji na format chcesz:

select descrip, 
    max(case when month = 'jan' then value else 0 end) jan, 
    max(case when month = 'feb' then value else 0 end) feb 
from 
(
    select id, month, col1 value, 'col1' descrip 
    from yourtable 
    union all 
    select id, month, col2 value, 'col2' descrip 
    from yourtable 
    union all 
    select id, month, col3 value, 'col3' descrip 
    from yourtable 
    union all 
    select id, month, col4 value, 'col4' descrip 
    from yourtable 
) src 
group by descrip 

Zobacz SQL Fiddle with demo

wynik to:

| DESCRIP | JAN | FEB | 
----------------------- 
| col1 | A | C | 
| col2 | B | A | 
| col3 | 0 | G | 
| col4 | B | E | 
+0

Dziękuję za to! Super pomocny. –

+1

Dziękuję bardzo. Co jeśli 'twoja_tabela' jest wyprowadzoną tabelą pochodzi z podzapytania. Czy zamierzam zastąpić każdą "twojętablicę" czymś w rodzaju 'Z (WYBIERZ * Z tabeli GDZIE nazwa =" warunek ") t1'? –

+1

@Accountant م Tak, właśnie to robisz – Taryn

Powiązane problemy