Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle中的动态转置_Sql_Oracle_Oracle11g_Transpose - Fatal编程技术网

Sql Oracle中的动态转置

Sql Oracle中的动态转置,sql,oracle,oracle11g,transpose,Sql,Oracle,Oracle11g,Transpose,这是我的桌子 Equipmentid Application Value =========== =========== ===== k001 THK True k001 BHK False k001 KHK True 以下是我的预期: Equipmentid THK BHK KHK =========== === ===

这是我的桌子

Equipmentid    Application   Value
===========    ===========   =====
k001              THK         True
k001              BHK         False
k001              KHK         True
以下是我的预期:

Equipmentid    THK   BHK    KHK
===========    ===   ===    ===
k001           True  False  True
我试图使用max decode使用普通转置Oracle,但最后需要提到[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动态执行此操作的信息

嗨,尝试使用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动态执行此操作的信息


在这种情况下,您可以
左连接

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 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;
试试这个

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;


您可能误用了这里的数据库。检索数据并在客户端执行,可以是PL/SQL或任何其他OCI方法。@MaheswaranRavisankar,这是我从数据库获得的视图,没有机会解决这个问题?您需要动态构造SQL语句。类似的情况要复杂得多,而且这意味着您必须读取一次数据,构造查询,然后再次读取数据,这不是非常有效。嗨@JustinCave,我从视图中获取了此数据库,我需要使用正确或错误的应用程序对每个设备ID进行分类。我需要插入大约3000台设备。如果希望列的数量和名称是动态的,则需要动态SQL。如果希望不同行的列数和列名不同,则需要多个查询。如果要为表中存在的任何
应用程序
创建列,可以动态创建单个SQL语句。您可能在此处误用了数据库。检索数据并在客户端执行,可以是PL/SQL或任何其他OCI方法。@MaheswaranRavisankar,这是我从数据库获得的视图,没有机会解决这个问题?您需要动态构造SQL语句。类似的情况要复杂得多,而且这意味着您必须读取一次数据,构造查询,然后再次读取数据,这不是非常有效。嗨@JustinCave,我从视图中获取了此数据库,我需要使用正确或错误的应用程序对每个设备ID进行分类。我需要插入大约3000台设备。如果希望列的数量和名称是动态的,则需要动态SQL。如果希望不同行的列数和列名不同,则需要多个查询。如果你想为表中存在的任何
应用程序创建一列,你可以动态创建一个SQL语句hi@brenners1302,我有大约3000台设备,这意味着我需要一个接一个地进行操作?那么对于应用程序in('THK','BHK','KHK'),我需要在这里提到很多应用程序吗。。我的错,我没有完全理解你的问题就回答了,如果你手动列出所有的应用程序,似乎会有很多问题。我只是假设只有三个application@brenner1302,是的,如果只有3个应用程序,那么我当然可以使用您的代码,但这涉及很多应用程序:(@Kedai Ezbakr,我可以使用子查询,这样它可以有动态应用程序,但结果是XML类型的,我不知道如何将它转换为对您有用的东西。嗨@brenners1302,我有大约3000台设备,这意味着我需要一个接一个地做?然后在('THK','BHK','KHK'中进行应用),我需要在这里提到很多应用程序吗?。我的错,我没有完全理解您的问题就回答了,如果您手动列出所有应用程序,似乎会有很多问题。我只假设只有三个application@brenner1302,是的,如果只有3个应用程序,那么我当然可以使用你的代码,但这涉及到很多应用程序说明:(@Kedai Ezbakr,我可以使用子查询,这样它就可以有动态的应用程序,但结果是XML类型的,我不知道如何将它转换为对您有用的东西。嗨@dean,谢谢您的回复,但为了您的信息,我得到了很多应用程序的每个设备ID。然后我建议您使用brenners的答案,而不是insert for语句1乘1…尝试将其替换为('+@ColumnName+')中的FOR application@ColumnName可以声明为SELECT@ColumnName=ISNULL(@ColumnName+','',''))+QUOTENAME(Value)FROM(从Equipmentid='k001'的表中选择不同的值)非常感谢您的帮助,但稍后这个数据库将涉及3000个id,我需要将所有id都放在那里吗?sry用于答复…使用IN(@variable)@variable已经选择了您表中所有可能的应用程序…因此您在添加新的或删除应用程序时不必太在意。您好@dean,谢谢您的回复,但是为了您的信息,我在每个设备ID上都有许多应用程序。然后我建议您使用brenners的答案,而不是为stateme插入nt 1乘以1…尝试将其替换为('+@ColumnName+')中的FOR application@ColumnName可以声明为SELECT@ColumnName=ISNULL(@ColumnName+','','')+QUOTENAME(Value)FROM(从Equipmentid='k001'的表中选择不同的值)非常感谢您的帮助,但是稍后这个数据库将涉及3000个id,我需要将所有id都放在那里吗?请稍后回复…通过在(@variable)中使用,@variable已经选择了您表中所有可能的应用程序…因此您不必真正关心添加或删除应用程序Hi@MikhailovV