[英]Transposing Dynamic Columns to Rows
我想知道如何將Table_1
轉為Expected_Result_Table
:
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
那么,如何轉置Table_1
中的列導致Expected_Result_Table
,僅考慮值 > 0?
MySQL 沒有 UNPIVOT 函數,但您可以使用UNION ALL
將列轉換為行。
基本語法是:
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;
在您的情況下,您聲明您需要動態列的解決方案。 如果是這種情況,那么您將需要使用准備好的語句來生成動態 SQL:
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;
您基本上是將列中的數據逆透視為行,為此您可以使用 UNION ALL。 過濾器可以應用於非透視子查詢,也可以單獨應用於各個部分。
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.