mysql - 在 mysql V2 中将行转换为列

标签 mysql sql row

引用这篇文章:https://stackoverflow.com/questions/19985340/convert-rows-to-columns-in-mysql

我有这段代码,它连接了两个具有差异列名称的表,我想我可以这样做,以便我可以使用bluefeet的代码,因为我有单独的表,其中字符串位置位于table_1上,位置id为在表_2 上。看起来像这样

表_1:

id | location
1  | East Flow
2  | East Level
3  | East Pressure
4  | East MR
5  | West Flow
6  | West Level
7  | West Pressure
8  | West MR

表2:

locationid | val
   1       | 10
   2       | 20
   3       | 30
   4       | 40
   5       | 100
   6       | 200
   7       | 300
   8       | 400

因此,当您执行此查询时,它将如下所示:

SELECT id, locationid, location, val 
FROM table_1, table_2
WHERE id = locationid 
GROUP BY id

输出:

id   | locationid |     location    | val
1    |     1      |   East Flow     | 10
2    |     2      |   East Level    | 20
3    |     3      |   East Pressure | 30
4    |     4      |   East MR       | 40
5    |     5      |   West Flow     | 100
6    |     6      |   West Level    | 200
7    |     7      |   West Pressure | 300
8    |     8      |   West MR       | 400
<小时/>

我想将 @bluefeet 的代码合并到我的代码中,以便我可以使用她的代码,因为她的代码已经可以工作了:

select 
  substring_index(location, ' ', 1) Location,
  max(case when location like '%Flow' then val end) Flow,
  max(case when location like '%Level' then val end) Level,
  max(case when location like '%Pressure' then val end) Pressure,
  max(case when location like '%MR' then val end) MR
from yourtable
group by substring_index(location, ' ', 1)

我如何合并它?在选择中选择还是什么? 这就是我希望输出的样子:

从此:

  Location    | Val |
East Flow     | 10  |
East Level    | 20  |
East Pressure | 30  |
East MR       | 40  |
West Flow     | 100 |
West Level    | 200 |
West Pressure | 300 |
West MR       | 400 |

对此:

Location | Flow| Level | Pressure |  MR   |
East     | 10  |  20   |    300   |  400  |
West     | 100 |  200  |    300   |  400  |

最佳答案

您应该能够只需加入表即可获得结果:

select 
  substring_index(t1.location, ' ', 1) Location,
  max(case when t1.location like '%Flow' then t2.val end) Flow,
  max(case when t1.location like '%Level' then t2.val end) Level,
  max(case when t1.location like '%Pressure' then t2.val end) Pressure,
  max(case when t1.location like '%MR' then t2.val end) MR
from table_1 t1
inner join table_2 t2
  on t1.id = t2.locationid
group by substring_index(t1.location, ' ', 1)

参见SQL Fiddle with Demo

关于mysql - 在 mysql V2 中将行转换为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19987114/

相关文章:

MySQL UNION 语句选择两个具有特定值的列并选择另外两个具有另一个特定值的列

mysql - 日期时间等于或大于 MySQL 中的今天

mysql_affected_rows() 总是返回 1,即使没有行被更新

java - 无法从 servlet 上下文中检索 hibernate 外键

MySql 数据源和 MySQL 项目模板未出现在 Visual Studio 2013 社区版中

php - 根据日期自动执行操作。 PHP/MySQL

php - 从表的末尾获取连续值的数量

PHP - IF 语句为假,仍然运行

c# - 当我从现有数据库创建模型时, Entity Framework 4.0 生成只读模型

Python 按行在数据帧上应用函数