V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
delavior
V2EX  ›  问与答

问一个 sql 语句的写法

  •  
  •   delavior · 2015-10-21 15:41:02 +08:00 · 1540 次点击
    这是一个创建于 3339 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个表类似下面的结构
    |id|key|value|
    | 1 | a | 123 |
    | 1 | b | 456 |
    | 1 | c | 789 |

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

    请问如何实现

    第 1 条附言  ·  2015-10-21 16:52:01 +08:00
    数据库是 oracle
    8 条回复    2015-10-21 17:19:31 +08:00
    caoyue
        1
    caoyue  
       2015-10-21 15:59:51 +08:00
    取决于你用的什么数据库
    如果是 Oracle 或者 SqlServer ,用 PIVOT
    MySQL 的话,我能想到的动态的行转列好像只能自己先 select 行出来,然后再根据上一步的结果拼成 select a,b,c,.. 这样的查询语句了
    a591826944
        2
    a591826944  
       2015-10-21 16:03:18 +08:00
    mysql 我估计 就不如 查出来 自己用程序拼了
    ivvei
        3
    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
        4
    delavior  
    OP
       2015-10-21 16:54:35 +08:00
    @caoyue 是用的 oracle,不过 PIVOT 没用过,查了一下,貌似类似 case when ?等会试一下
    delavior
        5
    delavior  
    OP
       2015-10-21 16:54:48 +08:00
    @a591826944 不是 mysql ,是 oracle
    delavior
        6
    delavior  
    OP
       2015-10-21 16:59:57 +08:00
    @ivvei 对, id 还存在其他的,但是对于每个 id 来说, a 、 b 、 c 是固定的,只是它的值不一样。试了下, case when 好像不能用于起别名;配合聚合函数怎么用,没想明白,能详细说下吗
    caoyue
        7
    caoyue  
       2015-10-21 17:04:49 +08:00
    @delavior
    用 Oracle 不多,如果 Oracle 的 PIVOT 和 SqlServer 差不多的话:
    那么 PIVOT 也是静态的,想要动态的话,还是得第一步先取出行信息再拼成带 PIVOT 的 sql ,只是后面一步比 mysql 简单点
    ivvei
        8
    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 )
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5522 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 01:58 · PVG 09:58 · LAX 17:58 · JFK 20:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.