【问题标题】:Unpivot Multiple columns in Oracle is not working取消透视 Oracle 中的多个列不起作用
【发布时间】:2021-09-23 07:38:11
【问题描述】:

我有一张像下面这样的表格

Process_1 Tab1_Count Tab1_Process_Count Tab1_Status Process_2 Tab2_Count Tab2_Process_Count Tab2_Status
Tab1_Process 123 123 Equal Tab2_Process 123 126 Not Equal

我正在尝试像下面这样对上面的内容进行 Unpivot

TABLEPROCESS Tab_Count Process_Count Status
Tab1_Process 123 123 Equal
Tab2_Process 123 123 Not Equal

使用以下查询

SELECT * 
FROM
(       
SELECT 'Tab1' AS tab1_Process,
count(tb1.ID) AS tab1_count,
count(tbp1.ID) AS tab1_Process_count,
CASE WHEN count(tb1.ID)=count(tbp1.ID) THEN 'Equal' ELSE 'Not Equal' END AS Tab1_Status,
 'Tab2' AS tab2_Process,
count(tb2.ID) AS tab2_count,
count(tbp2.ID) AS tab2_Process_count,
CASE WHEN count(tb2.ID)=count(tbp2.ID) THEN 'Equal' ELSE 'Not Equal' END AS Tab2_Status
FROM table1 tb1
LEFT JOIN table1_process tbp1 ON tbp1.ID = tb1.ID
LEFT JOIN table2 tb2 ON tb2.ID = tb1.ID 
LEFT JOIN table1_process tbp2 ON tbp2.ID = tb2.ID
)
UNPIVOT
(
(TABLEPROCESS,STATUS)
FOR COUNT IN
(
(Tab1_Count,Tab2_Count) AS 'Tab_Count',
(Tab1_Process_Count,Tab2_Process_Count) AS 'Process_Count',
(Tab1_Status,Tab2_Status) AS 'STATUS'
)
)

但它给了我错误——ORA-00907:缺少右括号

根据 Alex Poole 的评论,尝试了 CROSS APPLY 方法

SELECT * 
    FROM
    (       
    SELECT 'Tab1' AS tab1_Process,
    count(tb1.ID) AS tab1_count,
    count(tbp1.ID) AS tab1_Process_count,
    CASE WHEN count(tb1.ID)=count(tbp1.ID) THEN 'Equal' ELSE 'Not Equal' END AS Tab1_Status,
     'Tab2' AS tab2_Process,
    count(tb2.ID) AS tab2_count,
    count(tbp2.ID) AS tab2_Process_count,
    CASE WHEN count(tb2.ID)=count(tbp2.ID) THEN 'Equal' ELSE 'Not Equal' END AS Tab2_Status
    FROM table1 tb1
    LEFT JOIN table1_process tbp1 ON tbp1.ID = tb1.ID
    LEFT JOIN table2 tb2 ON tb2.ID = tb1.ID 
    LEFT JOIN table1_process tbp2 ON tbp2.ID = tb2.ID
    )
    CROSS APPLY
    VALUES (
    
    (tab1_Process,Tab1_Count,Tab1_Process_Count,Tab1_Status),
    (tab2_Process,Tab2_Count,Tab2_Process_Count,Tab2_Status),
    
    ) (Process,Tab_Count,Process_Count,Status);

它在 SQL Server 中工作,但它给出了 ORA-00903: invalid table name in oracle

我是oracle新手,请帮忙

【问题讨论】:

  • 它给你什么错误?实际上,它会抛出 ORA-00936,因为您在内部查询中有一个额外的 select。我认为,修复后 unpivot 将抛出 ORA-01790。您首先说您有一个表,但这实际上似乎是内部查询的结果;可能有其他方法可以直接从基表中获取您想要的结果。
  • 嗨@AlexPoole 额外的 SELECT 是拼写错误,我得到的错误是 ORA-00907:缺少右括号

标签: oracle oracle19c


【解决方案1】:

使用以下 UNPIVOT 查询实现了预期结果

SELECT TABLEPROCESS,TAB_COUNT,PROCESS_COUNT,STATUS 
FROM
(       
SELECT 'Tab1' AS tab1_Process,
count(tb1.ID) AS tab1_count,
count(tbp1.ID) AS tab1_Process_count,
CASE WHEN count(tb1.ID)=count(tbp1.ID) THEN 'Equal' ELSE 'Not Equal' END AS Tab1_Status,
 'Tab2' AS tab2_Process,
count(tb2.ID) AS tab2_count,
count(tbp2.ID) AS tab2_Process_count,
CASE WHEN count(tb2.ID)=count(tbp2.ID) THEN 'Equal' ELSE 'Not Equal' END AS Tab2_Status
FROM table1 tb1
LEFT JOIN table1_process tbp1 ON tbp1.ID = tb1.ID
LEFT JOIN table2 tb2 ON tb2.ID = tb1.ID 
LEFT JOIN table1_process tbp2 ON tbp2.ID = tb2.ID
)
UNPIVOT
(
(TABLEPROCESS,TAB_COUNT,PROCESS_COUNT,STATUS)
FOR (t,c,p,s) 
 IN
 (
   (tab1_Process,Tab1_Count,Tab1_Process_Count,Tab1_Status),
   (tab2_Process,Tab2_Count,Tab2_Process_Count,Tab2_Status)

 )
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多