MySQL 使用动态行值作为列名

Posted

技术标签:

【中文标题】MySQL 使用动态行值作为列名【英文标题】:MySQL Use dynamic row values as column names 【发布时间】:2020-11-08 09:06:47 【问题描述】:

我有这组由多个表构建的数据(查看表)。

我的问题是,我无法以“水平”方式显示它们。我搜索并找到了几个解决方案,但它们现在是outdated。

他们使用数据透视表或交叉表查询或 group_concat()。

所以我需要的结果是,动态 BoxName 将是一个列名,价格将在每个列名下。然后 Route 将成为行标题。

我的目标:

我尝试通过jQuery 操作数据,但失败了,所以我最后的办法是修复 mysql 数据,以便 jQuery 显示更容易。

非常感谢任何帮助。

【问题讨论】:

在 mysql 8 中仍然有效,如果您不使用 mysql 8 cte 将无法与以前的 mysql 版本一起使用,也不要发布图片作为数据 您可以通过两个步骤完成:1) 获取变体,即使用简单查询的列名称。 2) 使用动态 SQL,您可以组装生成所需表的查询。 考虑处理应用代码中数据显示的问题 【参考方案1】:

第 1 步:获取列名:

select distinct BoxName from t

例如,此查询将返回:

BoxName
-----------
Small Box    
Medium Box
Large Box
Regular Box
Jumbo Box

第 2 步:组装一个动态查询。现在您知道了列,您可以将主查询准备为:

select
  Route,
  max(case when BoxName = 'Small Box' then price end) as `Small Box`,
  max(case when BoxName = 'Medium Box' then price end) as `Medium Box`,
  max(case when BoxName = 'Large Box' then price end) as `Large Box`,
  max(case when BoxName = 'Regular Box' then price end) as `Regular Box`,
  max(case when BoxName = 'Jumbo Box' then price end) as `Jumbo Box`
from t
group by Route
order by max(display_order)

【讨论】:

以上是关于MySQL 使用动态行值作为列名的主要内容,如果未能解决你的问题,请参考以下文章

动态生成列名时如何获取kendo选择的行值

通过特定行值动态获取列名

Mysql - 通过引用另一个数据集动态更改列名

如何在动态查询中将行值连接到列名

在 mysql 的表中搜索特定行值的列名

SQL将一些列名转换为行值,将一个列名行值转换为列名