delavior
V2EX  ›  问与答

问一个 sql 语句的写法

  •  
  •   delavior · Oct 21, 2015 · 1909 views
    This topic created in 3886 days ago, the information mentioned may be changed or developed.

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

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

    请问如何实现

    Supplement 1  ·  Oct 21, 2015
    数据库是 oracle
    8 replies    2015-10-21 17:19:31 +08:00
    caoyue
        1
    caoyue  
       Oct 21, 2015
    取决于你用的什么数据库
    如果是 Oracle 或者 SqlServer ,用 PIVOT
    MySQL 的话,我能想到的动态的行转列好像只能自己先 select 行出来,然后再根据上一步的结果拼成 select a,b,c,.. 这样的查询语句了
    a591826944
        2
    a591826944  
       Oct 21, 2015
    mysql 我估计 就不如 查出来 自己用程序拼了
    ivvei
        3
    ivvei  
       Oct 21, 2015
    你这个给的示例内容还是略少,不清楚具体数据咋样的。我猜测一下啊,你这里的 id 都是 1 ,那是不是还存在着 id = 2, key = a 。。。。 这样的数据?如果存在的话,那么每个 id 下的 key 都是 a,b,c 三个么? 如果每个 id 下的 key 的数量不同,那你这个查询很难办啊,转换后每行的列数都不同了…… 而如果每个 id 下的 key 是相同的,那你可以考虑用 case when 配合聚合函数来写, 这种写法 mysql 应该也能使。
    delavior
        4
    delavior  
    OP
       Oct 21, 2015
    @caoyue 是用的 oracle,不过 PIVOT 没用过,查了一下,貌似类似 case when ?等会试一下
    delavior
        5
    delavior  
    OP
       Oct 21, 2015
    @a591826944 不是 mysql ,是 oracle
    delavior
        6
    delavior  
    OP
       Oct 21, 2015
    @ivvei 对, id 还存在其他的,但是对于每个 id 来说, a 、 b 、 c 是固定的,只是它的值不一样。试了下, case when 好像不能用于起别名;配合聚合函数怎么用,没想明白,能详细说下吗
    caoyue
        7
    caoyue  
       Oct 21, 2015
    @delavior
    用 Oracle 不多,如果 Oracle 的 PIVOT 和 SqlServer 差不多的话:
    那么 PIVOT 也是静态的,想要动态的话,还是得第一步先取出行信息再拼成带 PIVOT 的 sql ,只是后面一步比 mysql 简单点
    ivvei
        8
    ivvei  
       Oct 21, 2015
    @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 )
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2635 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 16:03 · PVG 00:03 · LAX 09:03 · JFK 12:03
    ♥ Do have faith in what you're doing.