postgresql 行转列,列转行后加入到一个整体数据

这里行转列的基本思想就是使用max,因为其他列下面都是NULL,所以可以Max最后就只能得到有值的这行

普通的查询:

复制代码
SELECT
 icd ,
 case when 
(ROW_NUMBER() OVER(PARTITION BY INNER_CD ORDER BY SLIDE_SEQ )) =1  then  SLIDE_QTY  END  as SLIDE_QTY1,
 case when                                                                                                                     
(ROW_NUMBER() OVER(PARTITION BY INNER_CD ORDER BY SLIDE_SEQ )) =1 then SLIDE_S_UNIT_PRICE END   as SLIDE_S_UNIT_PRICE1,
 case when                                                                                                                     
(ROW_NUMBER() OVER(PARTITION BY INNER_CD ORDER BY SLIDE_SEQ )) =2 then SLIDE_QTY END   as SLIDE_QTY2,
 case when                                                                                                                     
(ROW_NUMBER() OVER(PARTITION BY INNER_CD ORDER BY SLIDE_SEQ )) =3 then SLIDE_QTY END  as SLIDE_QTY3

FROM
    "temp"."user" mm
WHERE 
mm.icd = 'ADDM01-20160612-1-100002-001'
复制代码

得到的数据是:

使用max后:

复制代码
SELECT  
    MAX( case when  SLIDE_SEQ = 1 THEN SLIDE_QTY  END  )as SLIDE_QTY1,
    MAX( case when  SLIDE_SEQ = 2 THEN SLIDE_QTY  END  )as SLIDE_QTY2,
    MAX( case when  SLIDE_SEQ = 3 THEN SLIDE_QTY  END  )as SLIDE_QTY3,
    MAX( case when  SLIDE_SEQ = 4 THEN SLIDE_QTY  END  )as SLIDE_QTY4,
    MAX( case when  SLIDE_SEQ = 5 THEN SLIDE_QTY  END  )as SLIDE_QTY5,
    MAX( case when  SLIDE_SEQ = 6 THEN SLIDE_QTY  END  )as SLIDE_QTY6,
    MAX( case when  SLIDE_SEQ = 7 THEN SLIDE_QTY  END  )as SLIDE_QTY7,
    MAX( case when  SLIDE_SEQ = 8 THEN SLIDE_QTY  END  )as SLIDE_QTY8,
    MAX( case when  SLIDE_SEQ = 9 THEN SLIDE_QTY  END  )as SLIDE_QTY9,
    MAX( case when  SLIDE_SEQ = 10 THEN SLIDE_QTY  END  )as SLIDE_QTY10
FROM
user
WHERE 
anken_id = 'ADDM01-20160612-1-100002-001'
复制代码

得到的结果:

然后可以通过子查询进行组合

复制代码
    SELECT * from  
m_product INNER JOIN 
    ( SELECT  
    anken_id,
        icd,
        MAX( case when  SLIDE_SEQ = 1 THEN SLIDE_QTY  END  )as SLIDE_QTY1,
        MAX( case when  SLIDE_SEQ = 2 THEN SLIDE_QTY  END  )as SLIDE_QTY2,
        MAX( case when  SLIDE_SEQ = 3 THEN SLIDE_QTY  END  )as SLIDE_QTY3,
        MAX( case when  SLIDE_SEQ = 4 THEN SLIDE_QTY  END  )as SLIDE_QTY4,
        MAX( case when  SLIDE_SEQ = 5 THEN SLIDE_QTY  END  )as SLIDE_QTY5,
        MAX( case when  SLIDE_SEQ = 6 THEN SLIDE_QTY  END  )as SLIDE_QTY6,
        MAX( case when  SLIDE_SEQ = 7 THEN SLIDE_QTY  END  )as SLIDE_QTY7,
        MAX( case when  SLIDE_SEQ = 8 THEN SLIDE_QTY  END  )as SLIDE_QTY8,
        MAX( case when  SLIDE_SEQ = 9 THEN SLIDE_QTY  END  )as SLIDE_QTY9,
        MAX( case when  SLIDE_SEQ = 10 THEN SLIDE_QTY  END  )as SLIDE_QTY10
    FROM
    user
WHERE 
user.anken_id = 'ADDM01-20160612-1-100002-001'
GROUP BY user.inner_cd,user.anken_id) t1 on  m_product.anken_id = t1.anken_id
where t1.anken_id = 'ADDM01-20160612-1-100002-001'
复制代码

就可以得到富含行转列数据的。

列转行的基本思路就是通过制定一个共同的字段,然后将查询来的数据一行一行的累加起来。

复制代码
    SELECT
                aa,
                bb,
        c_1 AS cCount
    FROM
        TEMP .AAAA
    WHERE
        TEMP .AAAA.Id = 'ADDM01201606120001'
    UNION ALL
        SELECT
                aa,
                bb,
            c_2 AS cCount
        FROM
            TEMP .AAAA
        WHERE
            TEMP .AAAA.Id = 'ADDM01201606120001'
        UNION ALL
            SELECT
                aa,
                bb,
                c_3 AS cCount
            FROM
                TEMP .AAAA
            WHERE
                TEMP .AAAA.Id = 'ADDM01201606120001'
复制代码

 

posted on   手撕高达的村长  阅读(11138)  评论(0编辑  收藏  举报

编辑推荐:
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
阅读排行:
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 2025成都.NET开发者Connect圆满结束
历史上的今天:
2014-06-20 PHP 给前面或者后面添加0补位
2014-06-20 PHP in_array不兼容问题
2014-06-20 PHP 数组的值插入

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示