2013-05-03 14 views
9

satırları Dinamik Sütunlar aktaran UNPIVOT nasıl bilmek Table_1Expected_Result_Table içine:İsterdim

Table1 
----------------------------------------- 
Id  abc brt ccc ddq eee fff gga hxx 
----------------------------------------- 
12345  0 1 0 5 0 2 0 0 
21321  0 0 0 0 0 0 0 0 
33333  2 0 0 0 0 0 0 0 
41414  0 0 0 0 5 0 0 1 
55001  0 0 0 0 0 0 0 2 
60000  0 0 0 0 0 0 0 0 
77777  9 0 3 0 0 0 0 0 
Expected_Result_Table 
--------------------- 
Id  Word Qty>0 
--------------------- 
12345 brt 1 
12345 ddq 5 
12345 fff 2 
33333 abc 2 
41414 eee 5 
41414 hxx 1 
55001 hxx 2 
77777 abc 9 
77777 ccc 3 

Yani yalnızca değerleri Expected_Result_Table sonuçlanan dikkate Table_1 sütunları devrik nasıl> 0 ?

cevap

19

MySQL bir UNPIVOT fonksiyonu yoktur, ancak bir UNION ALL kullanarak sıralar halinde sütunlar dönüştürebilirsiniz.

temel sözdizimi şöyledir: Senin durumunda

select id, word, qty 
from 
(
    select id, 'abc' word, abc qty 
    from yt 
    where abc > 0 
    union all 
    select id, 'brt', brt 
    from yt 
    where brt > 0 
) d 
order by id; 

, size dinamik sütunlar için bir çözüm gerektiğini belirtmektedirler.

SET @sql = NULL; 

SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'select id, ''', 
     c.column_name, 
     ''' as word, ', 
     c.column_name, 
     ' as qty 
     from yt 
     where ', 
     c.column_name, 
     ' > 0' 
    ) SEPARATOR ' UNION ALL ' 
) INTO @sql 
FROM information_schema.columns c 
where c.table_name = 'yt' 
    and c.column_name not in ('id') 
order by c.ordinal_position; 

SET @sql 
    = CONCAT('select id, word, qty 
      from 
      (', @sql, ') x order by id'); 


PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SQL Fiddle with Demo

+0

Merhaba, bluefeet! Sadece sorunu çözdün. Çok teşekkürler! –

+0

Bu harika .. sihir mi yapıyor :) – UberNeo

6

Temel olarak sütunlardan gelen verileri UNION ALL olanağını kullanabileceğiniz satırlara dönüştürüyorsunuz. Filtreler, düzenlenmemiş alt sorguya veya ayrı ayrı bölümlere uygulanabilir.

select id, Word, Qty from 
(
    select id, 'abc' Word, abc Qty from table1 
    union all 
    select id, 'brt', brt from table1 
    union all 
    select id, 'ccc', ccc from table1 
    union all 
    select id, 'ddq', ddq from table1 
    union all 
    select id, 'eee', eee from table1 
    union all 
    select id, 'fff', fff from table1 
    union all 
    select id, 'gga', gga from table1 
    union all 
    select id, 'hxx', hxx from table1 
) x 
where Qty > 0 
order by id; 
+0

[SQL Fiddle Demo] (http://sqlfiddle.com/#!2/ bakınız: Eğer durum buysa, o zaman dinamik SQL oluşturmak için hazırlanmış deyimi kullanması gerekecektir b0934/6/0) – RichardTheKiwi

+0

Teşekkürler, Richard. Masamın dinamik ve bilinmeyen sütunları var. –

İlgili konular