2009-04-20 10 views
2

Ich habe die folgenden zwei PL/SQL Oracle Abfragen, die eine Zählung zurück:Mehrfachzählungen mit einzelnen PL SQL Query

SELECT count(*) 
    INTO counter_for_x 
    FROM Table_Name 
WHERE Column_Name = 'X'; 

SELECT count(*) 
    INTO counter_for_y 
    FROM Table_Name 
WHERE Column_Name = 'Y'; 

Ist es möglich, eine einzelne Abfrage zu schreiben, die beide gibt die Zählungen und füllt die entsprechenden Zählervariablen?

Antwort

8
SELECT (
     SELECT COUNT(*) 
     FROM table_name 
     WHERE column_name = 'X' 
     ), 
     (
     SELECT COUNT(*) 
     FROM table_name 
     WHERE column_name = 'Y' 
     ) 
INTO counter_for_x, counter_for_y 
FROM dual 
1

können Sie, aber ich würde es nicht tun ...

select nvl(sum(decode(column_name,'X',1,0)),0), nvl(sum(decode(column_name,'Y',1,0)),0) 
    into counter_for_x, counter_for_y 
    from table_name 
    where column_name in ('X', 'Y'); 
1

Ein anderer Weg.

SELECT 
    Max(CASE WHEN Column_Name = 'X' THEN Count ELSE NULL END) AS Count_X , 
    MAX(CASE WHEN Column_Name = 'Y' THEN Count ELSE NULL END) AS Count_Y 
FROM 
(
    SELECT count(*) as Count, Column_Name 
    FROM Table_Name 
    Where Column_Name in ('X', 'Y') 
    Group By Column_Name 
) AS InnerTable 
1

Dies wird es tun:

select count(decode(column_name,'X',1)) x_count 
,  count(decode(column_name,'Y',1)) y_count 
into counter_for_x, counter_for_y 
from table_name 
where column_name in ('X','Y'); 

oder wenn Sie CASE mit Bevorzugen:

select count(case when column_name = 'X' then 1 end) x_count 
,  count(case when column_name = 'Y' then 1 end) y_count 
into counter_for_x, counter_for_y 
from table_name 
where column_name in ('X','Y');