【问题标题】:Rotate and summarize a part of a SQL Table旋转和汇总 SQL 表的一部分
【发布时间】:2020-09-09 09:49:59
【问题描述】:

嘿,我是 SQL 新手。我有一个这样的表,我想将它转换/写入另一个表。

|sessionid |key  |value|
-----------------------
|12345678  |key1 |val1 |
|12345678  |key1 |val2 |
|12345678  |key1 |val3 |
|12345678  |key1 |val4 |
|12345678  |key1 |val5 |
|12345678  |key2 |lav1 |
|12345678  |key2 |lav2 |
|12345678  |key2 |lav3 |
|12345678  |key2 |lav4 |
|12345678  |key3 |lav1 |
|12345678  |key3 |lav2 |

我想用这种格式写一个新表:

|sessionid |key1 |key2 |
------------------------
|12345678  |val1 |lav1 |
|12345678  |val2 |lav2 |
|12345678  |val3 |lav3 |
|12345678  |val4 |lav4 |
|12345678  |val5 |null |

我拥有的是这样的:

SELECT sessionid ,
        
    -- KEY1        
        CASE 
            WHEN logtagname = 'key1' 
            THEN value 
        END AS 'vp_session_id',
        
    -- KEY2        
        CASE 
            WHEN logtagname = 'key2' 
            THEN value 
        END AS 'diy_module',

FROM    table

返回这个:

|sessionid|key1 |key2 |
-----------------------
|12345678 |val1 |null |
|12345678 |val2 |null |
|12345678 |val3 |null |
|12345678 |val4 |null |
|12345678 |val5 |null |
|12345678 |null |lav1 |
|12345678 |null |lav2 |
|12345678 |null |lav3 |
|12345678 |null |lav4 |

有人可以帮忙吗?

【问题讨论】:

  • 如果有两个以上的键怎么办?
  • @forpas 然后应该忽略我会编辑我的问题谢谢

标签: mysql sql stored-procedures pivot case


【解决方案1】:

SQL 表代表无序 集合。因此,您可以使用条件聚合(稍加改动)在单独的列中获取值。但是您无法控制排列哪些键值。为此,您需要有一个排序列。

这个想法是:

select sessionid,
       max(case when key = 'key1' then value end) key1,
       max(case when key = 'key2' then value end) key2
from (select t.*,
             row_number() over (partition by sessionid, key order by value) as seqnum
      from t
     ) t
group by sessionid, seqnum;

【讨论】:

  • 在 '(PARTITION BY sessionid... 附近使用的语法错误...
  • @Soteri 。 . .自大约 2.5 年前发布 8.0 版以来,此语法已在 MySQL 中可用。
猜你喜欢
  • 2018-10-03
  • 1970-01-01
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
相关资源
最近更新 更多