MySQL 列标题为单列,第二列为值 [重复]

Posted

技术标签:

【中文标题】MySQL 列标题为单列,第二列为值 [重复]【英文标题】:MySQL Column headers into a single column, second column for the values [duplicate] 【发布时间】:2017-09-25 08:13:58 【问题描述】:

我目前有一个表格,显示我需要的数据,格式为

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

一个有效的建议是联合所有,但是我需要一个动态查询 因为将来会继续添加该表。

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

【问题讨论】:

这些破折号是什么?他们真的是破折号还是那里有其他东西,例如空字符串还是null? 在表格中他们只是0的 在这个问题中,有人问了类似的问题。这里的关键字是transpondingunpivot。 ***.com/questions/31238717/… 【参考方案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

【讨论】:

如果&lt;column&gt; 没有什么可加入的,我如何才能进入我的决赛桌? 您将迭代第一个查询的结果集并为最终结果创建联合查询。 &lt;column&gt; 只是第一个查询中一行的值。【参考方案2】:

您可以结合聚合进行反透视以生成所需的输出。感谢您要为每个游戏计算的值与相应游戏列的总和一致。之所以如此,是因为您说所有其他值都为零。

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

【讨论】:

【参考方案3】:

这应该可行

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

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

【讨论】:

mysql 不支持 CTE,但无论如何您的数据与问题中的数据不匹配,q.v.以上cmets。 在这种情况下,我将删除 cte 并重组数据 可以,但问题是我需要动态查询

以上是关于MySQL 列标题为单列,第二列为值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将逗号分隔的值与 MySQL 中的单列值匹配 [重复]

删除单列和多列同时重复值

MySQL约束条件(主键-自增-默认值)

MySQL - 为每个重复值获取一个计数器

根据 CSV 文件行中的值确定数据类型

MySQL根据列删除重复数据