我在这里跟随一个问题,使用Mysql查询将行动态转换为列。这工作正常,但我需要根据两列进行转换,
上面链接中提到的查询适用于单列“数据”,但我想适用于“数据”和“价格”两列。
我在这里加了一个例子,
给定一个表A,看起来像
Table A
| id|order|data|item|Price|
-----+-----+----------------
| 1| 1| P| 1 | 50 |
| 1| 1| P| 2 | 60 |
| 1| 1| P| 3 | 70 |
| 1| 2| Q| 1 | 50 |
| 1| 2| Q| 2 | 60 |
| 1| 2| Q| 3 | 70 |
| 2| 1| P| 1 | 50 |
| 2| 1| P| 2 | 60 |
| 2| 1| P| 4 | 80 |
| 2| 3| S| 1 | 50 |
| 2| 3| S| 2 | 60 |
| 2| 3| S| 4 | 80 |
我想编写一个如下查询:
Result Table
| id|order1|order2|order3|item1|item2|item3|item4|
-----+-----+---------------------------------------
| 1| P | Q | | 50 | 60 | 70 | |
| 2| P | | S | 50 | 60 | | 80 |
我试图创建两个不同的查询,然后创建一个联接来实现此目的,但这可能不是一个好的解决方案。谁能建议像上面链接中提到的解决方案。
谢谢
如果你有值的已知数量的两个order
和item
,那么你可以硬编码查询到:
select id,
max(case when `order` = 1 then data end) order1,
max(case when `order` = 2 then data end) order2,
max(case when `order` = 3 then data end) order3,
max(case when item = 1 then price end) item1,
max(case when item = 2 then price end) item2,
max(case when item = 3 then price end) item3,
max(case when item = 4 then price end) item4
from tableA
group by id;
参见演示。但是您将要遇到的部分问题是因为您试图转换多列数据。我建议获得最终结果的方法是先取消数据透视。MySQL没有取消透视功能,但是您可以使用UNION
ALL将多对列转换为行。要取消透视的代码将类似于以下内容:
select id, concat('order', `order`) col, data value
from tableA
union all
select id, concat('item', item) col, price value
from tableA;
参见演示。其结果将是:
| ID | COL | VALUE |
-----------------------
| 1 | order1 | P |
| 1 | order1 | P |
| 1 | order1 | P |
| 1 | item1 | 50 |
| 1 | item2 | 60 |
| 1 | item3 | 70 |
如您所见,这占用了order
/ data
和item
/
的多个列,price
并将其转换为多行。一旦完成,您就可以使用带有CASE的聚合函数将值转换回列:
select id,
max(case when col = 'order1' then value end) order1,
max(case when col = 'order2' then value end) order2,
max(case when col = 'order3' then value end) order3,
max(case when col = 'item1' then value end) item1,
max(case when col = 'item2' then value end) item2,
max(case when col = 'item3' then value end) item3
from
(
select id, concat('order', `order`) col, data value
from tableA
union all
select id, concat('item', item) col, price value
from tableA
) d
group by id;
参见演示。最后,您需要将以上代码转换为动态的预处理语句查询:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when col = ''',
col,
''' then value end) as `',
col, '`')
) INTO @sql
FROM
(
select concat('order', `order`) col
from tableA
union all
select concat('item', `item`) col
from tableA
)d;
SET @sql = CONCAT('SELECT id, ', @sql, '
from
(
select id, concat(''order'', `order`) col, data value
from tableA
union all
select id, concat(''item'', item) col, price value
from tableA
) d
group by id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
请参阅带有演示的SQL Fiddle。结果如下:
| ID | ORDER1 | ORDER2 | ORDER3 | ITEM1 | ITEM2 | ITEM3 | ITEM4 |
-------------------------------------------------------------------
| 1 | P | Q | (null) | 50 | 60 | 70 | (null) |
| 2 | P | (null) | S | 50 | 60 | (null) | 80 |
问题内容: MySQL是否可以将列转换为行,从而动态添加行所需的列数。我认为我的问题可能与数据透视表有关,但是我不确定,除了给出以下示例之外,我不知道如何构造此问题。 给定两个表A和B,它们看起来像 表A 我想编写一个如下查询: 结果表 基本上,我想将表B中的每一行变成结果表中的一列。如果有一个新条目被添加到表B中,id = 1,那么我希望结果表自动扩展一列以容纳这个额外的数据点。 问题答案: 您
问题内容: 我正在处理数据透视表查询。架构如下 Sno,名称,地区 同一名称可能在许多地区出现,例如以样本数据为例 如您所见,我有一组4个不同的地区(CA,JB,MN,LP)。现在,我想通过将名称映射到区域来获取为其生成的数据透视表 我为此写了以下查询 但是,地区可能会增加,在这种情况下,我将不得不再次手动编辑查询并向其中添加新的地区。 我想知道是否存在一个查询,该查询可以动态获取不同地区的名称并
问题内容: 我有一个简单的查询,它产生以下结果: 我想将行转置为列。 我了解mysql没有枢轴功能,因此需要工会,但不能100%确定。 先谢谢您的帮助。 问题答案: 您可以使用这样的交叉表来做到这一点- 另外,您应该将transporttype值移动到查找表中,并在该表中包含transporttype_id。
问题内容: 我在SQL Server 2008中具有下表: 我需要创建以下输出的查询: 列可以固定为[Mitarbeiter1]-[Mitarbeiter5],因为每个Filiale的行数不能超过5行。 非常感谢您的帮助! 问题答案: 使用SQL Server 2008,将Pivot和Rank函数组合在一起,可以为每个雇员数量提供理想的结果。首先,我们为每个分支中的每个员工分配一个ID,从每个新分
问题内容: 我有一个如下所示的表。我的问题是:如何将列转换为行?我正在使用Microsoft SQL Server 我需要像下面的操作 怎么做?谢谢 问题答案: 您的资料 询问 结果集
问题内容: 一个菜鸟MYSQL用户....我有一个简单的MySQL查询,该查询返回值,并使用GROUP_CONCAT函数: 但是,我需要转置查询,以便它以单独的列而不是行的形式返回“名称”。MySQL完全有可能吗? 问题答案: 您需要执行一项操作,MySQL本身不支持该操作(与某些其他RDBMS不同)。 您可以获得的最接近的结果是按照以下几行构造SQL: 如果可能的值是动态的,则可以从以下结果中以