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

时间:2023-03-08 22:26:30
postgresql 行转列,列转行后加入到一个整体数据

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

普通的查询:

SELECT
icd ,
case when
(ROW_NUMBER() OVER(PARTITION BY INNER_CD ORDER BY SLIDE_SEQ )) = then SLIDE_QTY END as SLIDE_QTY1,
case when
(ROW_NUMBER() OVER(PARTITION BY INNER_CD ORDER BY SLIDE_SEQ )) = then SLIDE_S_UNIT_PRICE END as SLIDE_S_UNIT_PRICE1,
case when
(ROW_NUMBER() OVER(PARTITION BY INNER_CD ORDER BY SLIDE_SEQ )) = then SLIDE_QTY END as SLIDE_QTY2,
case when
(ROW_NUMBER() OVER(PARTITION BY INNER_CD ORDER BY SLIDE_SEQ )) = then SLIDE_QTY END as SLIDE_QTY3 FROM
"temp"."user" mm
WHERE
mm.icd = 'ADDM01-20160612-1-100002-001'

得到的数据是:

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

使用max后:

SELECT
MAX( case when SLIDE_SEQ = THEN SLIDE_QTY END )as SLIDE_QTY1,
MAX( case when SLIDE_SEQ = THEN SLIDE_QTY END )as SLIDE_QTY2,
MAX( case when SLIDE_SEQ = THEN SLIDE_QTY END )as SLIDE_QTY3,
MAX( case when SLIDE_SEQ = THEN SLIDE_QTY END )as SLIDE_QTY4,
MAX( case when SLIDE_SEQ = THEN SLIDE_QTY END )as SLIDE_QTY5,
MAX( case when SLIDE_SEQ = THEN SLIDE_QTY END )as SLIDE_QTY6,
MAX( case when SLIDE_SEQ = THEN SLIDE_QTY END )as SLIDE_QTY7,
MAX( case when SLIDE_SEQ = THEN SLIDE_QTY END )as SLIDE_QTY8,
MAX( case when SLIDE_SEQ = THEN SLIDE_QTY END )as SLIDE_QTY9,
MAX( case when SLIDE_SEQ = THEN SLIDE_QTY END )as SLIDE_QTY10
FROM
user
WHERE
anken_id = 'ADDM01-20160612-1-100002-001'

得到的结果:

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

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

    SELECT * from
m_product INNER JOIN
( SELECT
anken_id,
icd,
MAX( case when SLIDE_SEQ = THEN SLIDE_QTY END )as SLIDE_QTY1,
MAX( case when SLIDE_SEQ = THEN SLIDE_QTY END )as SLIDE_QTY2,
MAX( case when SLIDE_SEQ = THEN SLIDE_QTY END )as SLIDE_QTY3,
MAX( case when SLIDE_SEQ = THEN SLIDE_QTY END )as SLIDE_QTY4,
MAX( case when SLIDE_SEQ = THEN SLIDE_QTY END )as SLIDE_QTY5,
MAX( case when SLIDE_SEQ = THEN SLIDE_QTY END )as SLIDE_QTY6,
MAX( case when SLIDE_SEQ = THEN SLIDE_QTY END )as SLIDE_QTY7,
MAX( case when SLIDE_SEQ = THEN SLIDE_QTY END )as SLIDE_QTY8,
MAX( case when SLIDE_SEQ = THEN SLIDE_QTY END )as SLIDE_QTY9,
MAX( case when SLIDE_SEQ = 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'