2012-12-19 14 views
9

BuMySQL Sütun

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

gibi bir tablo var Ve sonra kimse bu konuda yardım edebilir bu

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

gibi rapor oluşturmak istiyorsunuz (Pivot tablo) satır dönüştürme?

+0

Yığın akışına hoş geldiniz. [Bu çok yaygın bir sorudur] (http://stackoverflow.com/search?q= [mysql] + pivot). Arşivleri aramak için lütfen birkaç dakikanızı ayırın. İlk cevaplardan birini uyarlamayı deneyin. Daha sonra, sorun yaşarsanız, sorgunuzu ve burada oluşan hataları gönderin. – Leigh

+0

[MySQL pivot satırının dinamik sütun sayısına] olası kopyası (http://stackoverflow.com/questions/12004603/mysql-pivot-row-into-dynamic-number-of-columns) – RichardTheKiwi

cevap

28

Önce yapmanız gereken, önce verileri atamak ve sonra döndürmek. Ama ne yazık ki MySQL'in bu işlevleri yoktur, bu nedenle, CASE pivot için bir unpivot ve bir toplama fonksiyonu için UNION ALL sorgusunu kullanarak bunları çoğaltmanız gerekecektir.

UNPIVOT veya UNION ALL parça vb col1, col2, gelen verileri alır ve birden çok satır haline döner:

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 

SQL Fiddle with Demo bakınız.

Sonuç:

| 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 | 

Ardından istediğiniz formata dönüştürmek amacıyla CASE agrega uygulamak için bir alt sorguda bu sarın ve:

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 

Bkz SQL Fiddle with demo

sonuç:

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

Bunun için teşekkürler! Süper yardımsever. –

+1

Çok teşekkür ederim. Ya eğer "kendi hesabınız" bir alt sorgudan türetilmiş bir tabloysa. Ben her 'yourtable'ını' FROM (SELECT * FROM table WHERE name = 'condition') t1' gibi bir şeyle değiştireceğim mi? –

+1

@ Muhasebeci م Evet, tam olarak ne yaparsınız – Taryn