我目前有一个表格,以
的格式显示我需要的数据 SELECT * FROM XYZ;
Date | Brand | Game1| Game2 | Game3 |
2017 | xxxxx | xxxxxx | ---------- | -----------|
2017 | xxxxx | ----------| yyyyyyy | -----------|
2017 | xxxxx | ----------| -----------| yyyyyyy |
我希望数据显示的方式总共有4列,如下所示:
Date | Brand | GameName | Value
2017 | xxxxx | Game1 | 1234567.89
2017 | xxxxx | Game2 | 98.7654321
2017 | xxxxx | Game3 | 12345987.65
这样做的原因是,数据变得更容易过滤以查找特定值。
我已经在SO上尝试了大多数其他建议,但还没有取得多大成功
(例如group_concat
)。
一项有效的建议是全部联盟,但我需要一个动态查询 因为该表将在未来继续添加。
目前我正在尝试设置光标来执行此操作。
答案 0 :(得分:1)
如果您的表格会继续使用新列,那么无论您使用哪种查询,都必须先从INFORMATION_SCHEMA.TABLE
获取所有列,这是一种方法:
%Game%
模式UNION
或任何其他查询获取输出以下是一个例子:
SELECT `COLUMN_NAME`
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA`='db_name'
AND `TABLE_NAME`='table'
AND COLUMN_NAME LIKE '%Game%';
现在,从此查询的输出中构建动态UNION
查询,例如:
SELECT Date, Brand, `<column>`, Value
FROM table
UNION
SELECT Date, Brand, `<column>`, Value
FROM table
答案 1 :(得分:1)
您可以使用与聚合相结合的unpivot来生成所需的输出。感谢您为每个游戏计算的值与相应游戏列的总和一致。这是因为你说所有其他值都是零。
SELECT
Date,
MAX(CASE WHEN Game1 <> 0 THEN Brand END) AS Brand,
'Game1' AS GameName,
SUM(Game1) AS Value
FROM yourTable
GROUP BY Date
UNION ALL
SELECT
Date, MAX(CASE WHEN Game2 <> 0 THEN Brand END), 'Game2', SUM(Game2)
FROM yourTable
GROUP BY Date
UNION ALL
SELECT
Date, MAX(CASE WHEN Game3 <> 0 THEN Brand END), 'Game3', SUM(Game3)
FROM yourTable
GROUP BY Date
在这里演示:
答案 2 :(得分:1)
这应该有效
select Date, Brand, 'Game1', Game1 where Game1 is not null
UNION ALL
select Date, Brand, 'Game2' Game2 where Game2 is not null
UNION ALL
select Date, Brand, 'Game3' Game3 where Game3 is not null
您可以将其另存为视图并直接查询结果