oracle:未知列不通过存储过程的话,如何转行?

最近开发遇到一个棘手的问题,未知列数据怎么转换成行字段的问题。请教各位如何解决问题!

img

行转列嘛,根据FGX group by 取MAX就好了

【以下回答由 GPT 生成】

你可以使用透视表(pivot table)来将FMBLPS列的值转换为单独的字段并显示。透视表是一种数据汇总工具,可以将行字段转换为列字段。

以下是使用透视表来解决该问题的步骤:

  1. 首先,在你的查询语句的末尾添加一个子查询。这个子查询将FMBLPS列的值作为一个新的列,并命名为"FMBLPS"。注意,这里的表别名是必要的。

sql SELECT A.FGDH, A.FBMNAME, A.FC7, A.FC5, SUM(NVL(A.FM2,0)) AS FM2, COUNT(A.FM2) AS FMBLPS FROM A LEFT JOIN B ON A.FGDH = B.FGDH GROUP BY A.FGDH, A.FBMNAME, A.FC7, A.FC5

转换为:

sql SELECT T.*, T1.FMBLPS FROM ( SELECT A.FGDH, A.FBMNAME, A.FC7, A.FC5, SUM(NVL(A.FM2,0)) AS FM2, COUNT(A.FM2) AS FMBLPS FROM A LEFT JOIN B ON A.FGDH = B.FGDH GROUP BY A.FGDH, A.FBMNAME, A.FC7, A.FC5 ) T JOIN ( SELECT A.FGDH, COUNT(A.FM2) AS FMBLPS FROM A LEFT JOIN B ON A.FGDH = B.FGDH GROUP BY A.FGDH ) T1 ON T.FGDH = T1.FGDH

  1. 然后,在外部查询中使用透视表函数来将FMBLPS列的值转换为单独的字段。你可以使用CASE语句将不同的FMBLPS值映射到不同的列。注意,这里的表别名是必要的。

sql SELECT T.FGDH, T.FBMNAME, T.FC7, T.FC5, T.FM2, MAX(CASE WHEN T.FMBLPS = 1 THEN T.FMBLPS END) AS FMBLPS_1, MAX(CASE WHEN T.FMBLPS = 2 THEN T.FMBLPS END) AS FMBLPS_2, MAX(CASE WHEN T.FMBLPS = 3 THEN T.FMBLPS END) AS FMBLPS_3 FROM ( SELECT T.*, T1.FMBLPS FROM ( SELECT A.FGDH, A.FBMNAME, A.FC7, A.FC5, SUM(NVL(A.FM2,0)) AS FM2, COUNT(A.FM2) AS FMBLPS FROM A LEFT JOIN B ON A.FGDH = B.FGDH GROUP BY A.FGDH, A.FBMNAME, A.FC7, A.FC5 ) T JOIN ( SELECT A.FGDH, COUNT(A.FM2) AS FMBLPS FROM A LEFT JOIN B ON A.FGDH = B.FGDH GROUP BY A.FGDH ) T1 ON T.FGDH = T1.FGDH ) T GROUP BY T.FGDH, T.FBMNAME, T.FC7, T.FC5, T.FM2

这样,你就可以将FMBLPS列的值转换为单独的字段并显示。注意,根据实际情况,你可能需要调整透视表函数中的条件。

如果你想要根据表C的查询结果将FMBLPS列的值转换为单独的字段并显示,你可以将表C的查询结果作为另一个子查询,然后在外部查询中使用透视表函数。以下是具体的代码示例:

SELECT T.FGDH, T.FBMNAME, T.FC7, T.FC5, T.FM2,
       MAX(CASE WHEN T.FMBLPS = 1 THEN T.FMBLPS END) AS FMBLPS_1,
       MAX(CASE WHEN T.FMBLPS = 2 THEN T.FMBLPS END) AS FMBLPS_2,
       MAX(CASE WHEN T.FMBLPS = 3 THEN T.FMBLPS END) AS FMBLPS_3,
       C.SYSFORGNAME, C.SYSFEDITTIME
FROM (
    SELECT T.*, T1.FMBLPS
    FROM (
        SELECT A.FGDH, A.FBMNAME, A.FC7, A.FC5, SUM(NVL(A.FM2,0)) AS FM2,
               COUNT(A.FM2) AS FMBLPS
        FROM A LEFT JOIN B ON A.FGDH = B.FGDH
        GROUP BY A.FGDH, A.FBMNAME, A.FC7, A.FC5
    ) T
    JOIN (
        SELECT A.FGDH, COUNT(A.FM2) AS FMBLPS
        FROM A LEFT JOIN B ON A.FGDH = B.FGDH
        GROUP BY A.FGDH
    ) T1 ON T.FGDH = T1.FGDH
) T
LEFT JOIN (
    SELECT C.FGDH, C.SYSFORGNAME, C.SYSFEDITTIME
    FROM C
    WHERE C.FGDH = 'X'
    GROUP BY C.FC7, C.FC5
) C ON T.FGDH = C.FGDH
GROUP BY T.FGDH, T.FBMNAME, T.FC7, T.FC5, T.FM2, C.SYSFORGNAME, C.SYSFEDITTIME

希望这个解决方案对你有所帮助。如果你有任何问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^