问一个 sql 语句的写法

2015-10-21 15:41:02 +08:00
 delavior
有一个表类似下面的结构
|id|key|value|
| 1 | a | 123 |
| 1 | b | 456 |
| 1 | c | 789 |

我现在想要这样的结果
|id| a | b | c |
|1|123|456|789|

请问如何实现
1545 次点击
所在节点    问与答
8 条回复
caoyue
2015-10-21 15:59:51 +08:00
取决于你用的什么数据库
如果是 Oracle 或者 SqlServer ,用 PIVOT
MySQL 的话,我能想到的动态的行转列好像只能自己先 select 行出来,然后再根据上一步的结果拼成 select a,b,c,.. 这样的查询语句了
a591826944
2015-10-21 16:03:18 +08:00
mysql 我估计 就不如 查出来 自己用程序拼了
ivvei
2015-10-21 16:26:31 +08:00
你这个给的示例内容还是略少,不清楚具体数据咋样的。我猜测一下啊,你这里的 id 都是 1 ,那是不是还存在着 id = 2, key = a 。。。。 这样的数据?如果存在的话,那么每个 id 下的 key 都是 a,b,c 三个么? 如果每个 id 下的 key 的数量不同,那你这个查询很难办啊,转换后每行的列数都不同了…… 而如果每个 id 下的 key 是相同的,那你可以考虑用 case when 配合聚合函数来写, 这种写法 mysql 应该也能使。
delavior
2015-10-21 16:54:35 +08:00
@caoyue 是用的 oracle,不过 PIVOT 没用过,查了一下,貌似类似 case when ?等会试一下
delavior
2015-10-21 16:54:48 +08:00
@a591826944 不是 mysql ,是 oracle
delavior
2015-10-21 16:59:57 +08:00
@ivvei 对, id 还存在其他的,但是对于每个 id 来说, a 、 b 、 c 是固定的,只是它的值不一样。试了下, case when 好像不能用于起别名;配合聚合函数怎么用,没想明白,能详细说下吗
caoyue
2015-10-21 17:04:49 +08:00
@delavior
用 Oracle 不多,如果 Oracle 的 PIVOT 和 SqlServer 差不多的话:
那么 PIVOT 也是静态的,想要动态的话,还是得第一步先取出行信息再拼成带 PIVOT 的 sql ,只是后面一步比 mysql 简单点
ivvei
2015-10-21 17:19:31 +08:00
@delavior a,b,c 固定的话就简单了。
select id, a, b, c
from (select id, sum(case key when 'a' then value else 0 end) as a, sum(case key when 'b' then value else 0 end) as b, sum(case key when 'c' then value else 0 end) as c from T group by id )

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/229880

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX