如何在Oracle中动态转置

How to transpose dynamically in Oracle

这是我的table

Equipmentid    Application   Value
===========    ===========   =====
k001              THK         True
k001              BHK         False
k001              KHK         True

这是我的预期:

Equipmentid    THK   BHK    KHK
===========    ===   ===    ===
k001           True  False  True

我正在尝试使用最大解码使用普通转置 Oracle,但最后需要提及 AS [tablename],我想根据行名称动态创建行到列,此数据库将涉及非常多的应用。谢谢大家

您好,请尝试使用 PIVOT,

WITH x(equipment_id, application, VALUE ) 
     AS (SELECT 'k001', 'THK', 'TRUE' FROM DUAL UNION ALL
         SELECT 'k001', 'BHK', 'FALSE' FROM DUAL UNION ALL
         SELECT 'k001', 'KHK', 'TRUE' FROM DUAL  UNION ALL
         SELECT 'k002', 'KHK', 'FALSE' FROM DUAL UNION ALL
         SELECT 'k002', 'THK', 'FALSE' FROM DUAL UNION ALL
         SELECT 'k002', 'BHK', 'FALSE' FROM DUAL )

  SELECT * FROM
(
  SELECT equipment_id, value, application
  FROM x
)
PIVOT
(
  MAX(value)
  FOR application IN ('THK', 'BHK', 'KHK')
) order by equipment_id;

或者,如果你想拥有动态列,你可以在 IN 子句中使用子查询,然后使用 PIVOT XML,但结果将是 XML 类型,我不知道如何提取价值观。(只是说)如果你想知道更多关于如何使用 pl/sql 动态地做到这一点。 Read here .Here's the source

  SELECT * FROM
(
  SELECT equipment_id, value, application
  FROM x
)
PIVOT XML
(
  MAX(value)
  FOR application IN (SELECT DISTINCT application from x)
) order by equipment_id;

在这种情况下你可以left join

SELECT t1.Equipmentid, t2.Value AS 'THK', t3.Value AS 'BHK', t4.Value AS 'KHK' FROM TABLE t1
     LEFT JOIN (SELECT Equipmentid, Value FROM TABLE WHERE Application = 'THK') AS t2 ON (t1.Equipmentid = t2.Equipmentid)
     LEFT JOIN (SELECT Equipmentid, Value FROM TABLE WHERE Application = 'BHK') AS t3 ON (t1.Equipmentid = t3.Equipmentid)
     LEFT JOIN (SELECT Equipmentid, Value FROM TABLE WHERE Application = 'KHK') AS t4 ON (t1.Equipmentid = t4.Equipmentid)

虽然可以解决。但这种方法在我看来并不好。希望对你有帮助

试试这个。

SELECT EQUIPMENTID,
max(case  when  APPLICATION = 'THK' then VALUE end) as "THK",
max(case  when  APPLICATION = 'BHK' then VALUE end) as "BHK",
max(case  when  APPLICATION = 'KHK' then VALUE end) as "KHK"
FROM [tablename]
group by EQUIPMENTID;