首页 > 解决方案 > 旋转和汇总 SQL 表的一部分

问题描述

嘿,我是 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 |

有人可以帮忙吗?

标签: mysqlsqlstored-procedurespivotcase

解决方案


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;

推荐阅读