2017-04-17 98 views
0

是否有高效对此示例的替代SQL?我不想使用WITH ... AS,这是主要的标准SQL - 替代WITH ... AS

WITH TEMP_TABLE AS (
    SELECT status, COUNT(1) as total FROM XYZ GROUP BY status 
    ) 
SELECT 
     NVL((SELECT TOTAL FROM TEMP_TABLE WHERE STATUS = 'A'),0) AS A_COUNT , 
     NVL((SELECT TOTAL FROM TEMP_TABLE WHERE STATUS = 'B'),0) AS B_COUNT , 
     NVL((SELECT TOTAL FROM TEMP_TABLE WHERE STATUS = 'C'),0) AS C_COUNT , 
     NVL((SELECT TOTAL FROM TEMP_TABLE WHERE STATUS = 'D'),0) AS D_COUNT , 
     NVL((SELECT TOTAL FROM TEMP_TABLE WHERE STATUS = 'E'),0) AS E_COUNT , 
     NVL((SELECT TOTAL FROM TEMP_TABLE WHERE STATUS = 'F'),0) AS F_COUNT 
FROM DUAL; 

我读到类似的问题,但他们使用其他DDL的东西,我只想要一个基本的SQL语句。

+1

所以,你想知道如何摆脱[CTE(HTTP的://计算器.com/questions/38775056/creating-a-cte-in-oracle)从你的陈述? CTE的功能非常强大和高效......你为什么想要摆脱它? – SQLMason

+0

是的,我知道并喜欢它,但理由是骡子平台不支持它,至少不是一个实际的方式。请检查此http://stackoverflow.com/a/36877716/2815227 – mCeviker

+0

感谢您的解释,我不明白 – SQLMason

回答

4

只需使用条件汇总:

SELECT SUM(CASE WHEN STATUS = 'A' THEN 1 ELSE 0 END) AS A_COUNT , 
     SUM(CASE WHEN STATUS = 'B' THEN 1 ELSE 0 END) AS B_COUNT , 
     SUM(CASE WHEN STATUS = 'C' THEN 1 ELSE 0 END) AS C_COUNT , 
     SUM(CASE WHEN STATUS = 'D' THEN 1 ELSE 0 END) AS D_COUNT , 
     SUM(CASE WHEN STATUS = 'E' THEN 1 ELSE 0 END) AS E_COUNT , 
     SUM(CASE WHEN STATUS = 'F' THEN 1 ELSE 0 END) AS F_COUNT 
FROM XYZ ; 

我要指出的是把价值上的不同的行更容易:

select status, count(*) 
from xyz 
group by status; 
+0

在几秒钟内的答案:)现在尝试!在我的情况下,它们是更实际的,他们在同一行,因为我会truncate结果到一个json对象 – mCeviker

+0

这看起来更快在Oracle谢谢! – mCeviker

2

这是一个简单的PIVOT查询

select * 
from (select status from XYZ) 
pivot (
    count(*) for status in (
     'A' as a_count, 'B' as b_count, 
     'C' as c_count, 'D' as d_count, 
     'E' as e_count, 'F' as f_count 
)); 
1

已经给出答案是完美的,你应该使用它们。不过,为了给大家提供一个通用的解决方案(也许你有能力改变其他查询),这将是这一个:

SELECT 
    NVL((SELECT TOTAL FROM TEMP_TABLE WHERE STATUS = 'A'),0) AS A_COUNT , 
    NVL((SELECT TOTAL FROM TEMP_TABLE WHERE STATUS = 'B'),0) AS B_COUNT , 
    NVL((SELECT TOTAL FROM TEMP_TABLE WHERE STATUS = 'C'),0) AS C_COUNT , 
    NVL((SELECT TOTAL FROM TEMP_TABLE WHERE STATUS = 'D'),0) AS D_COUNT , 
    NVL((SELECT TOTAL FROM TEMP_TABLE WHERE STATUS = 'E'),0) AS E_COUNT , 
    NVL((SELECT TOTAL FROM TEMP_TABLE WHERE STATUS = 'F'),0) AS F_COUNT 
FROM 
    (SELECT status, COUNT(1) as total FROM XYZ GROUP BY status) TEMP_TABLE;