MySQL列标题为单列,第二列为值

时间:2017-09-25 08:13:59

标签: mysql sql cursors

我目前有一个表格,以

的格式显示我需要的数据

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

一项有效的建议是全部联盟,但我需要一个动态查询 因为该表将在未来继续添加。

目前我正在尝试设置光标来执行此操作。

3 个答案:

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

在这里演示:

Rextester

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

您可以将其另存为视图并直接查询结果