gpt4 book ai didi

mysql - 将动态列转置为行

转载 作者:行者123 更新时间:2023-11-29 18:49:21 24 4
gpt4 key购买 nike

我想知道如何将 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;

参见SQL Fiddle with Demo

关于mysql - 将动态列转置为行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44441484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com