2013-02-04 5 views
1

J'ai deux instructions SQL SELECT COUNT:combiner deux SQL sélectionner dans un

SELECT COUNT(*) FROM table1 t1 
INNER JOIN table2 t2 ON t2.id = t1.rowid 
WHERE t1.flag1 = false AND t2.flag2 = true; 

SELECT COUNT(*) FROM table1 t1 
INNER JOIN table2 t2 ON t2.id = t1.rowid 
WHERE t1.flag1 = true AND t2.flag2 = false; 

Comme on le voit la seule différence de ces deux déclarations sont la condition basculée. Mais ce que je veux faire est de combiner les deux instructions en une pour que la sortie devienne une table avec deux colonnes, la première colonne contienne le résultat de la première instruction et la deuxième colonne contient le résultat de la deuxième instruction . Quelque chose comme:

count1 | count 2 
------------------------- 
    3456 |  9864 

J'utilise PostgreSQL par la manière. Quelqu'un peut-il me dire comment faire cela?

Un grand merci

Répondre

4

Cela devrait le faire pour vous. Je ne suis pas familier avec PostgreSQL mais je pense que ça marchera.

SELECT 
    SUM(CASE WHEN t1.Flag1 = false AND t2.flag2 = true THEN 1 ELSE 0 END) Count1, 
    SUM(CASE WHEN t1.Flag1 = true AND t2.flag2 = false THEN 1 ELSE 0 END) Count2 
FROM 
    table1 t1 
    INNER JOIN table2 t2 ON t2.id = t1.rowid 
3

Si vous avez vraiment besoin de cette façon (utiliser deux requêtes SQL et les combiner) puis:

select * from 
(SELECT COUNT(*) FROM table1 t1 INNER JOIN table2 t2 ON t2.id = t1.rowid WHERE t1.flag1 = false AND t2.flag2 = true) a, 
(SELECT COUNT(*) FROM table1 t1 INNER JOIN table2 t2 ON t2.id = t1.rowid WHERE t1.flag1 = true AND t2.flag2 = false) b 

Basé sur SQL, ce serait la meilleure solution:

select 
    sum (case when not t1.flag1 and t2.flag2 then 1 else 0 end) as count1, 
    sum (case when t1.flag1 and not t2.flag2 then 1 else 0 end) as count2 
FROM 
    table1 t1 
    INNER JOIN table2 t2 ON t2.id = t1.rowid 

Vous pouvez également convertir le type booléen en nombre entier et raccourcir le sql (true :: int = 1, false :: int = 0):

select 
    sum((flag1::int<flag2::int)::int) count1, 
    sum((flag1::int>flag2::int)::int) count2  
from 
    table1 t1 
    join table2 t2 ON t2.id = t1.rowid 

Et parce que vrai> faux et faux < vrai (au moins dans PostgreSQL) vous pouvez écrire:

select 
    sum((flag1 < flag2)::int) count1, 
    sum((flag1 > flag2)::int) count2  
from 
    table1 t1 
    join table2 t2 ON t2.id = t1.rowid 
0
Select * from 
(
    SELECT COUNT(*) FROM table1 t1 
    INNER JOIN table2 t2 ON t2.id = t1.rowid 
    WHERE t1.flag1 = false AND t2.flag2 = true) tab1, 
(
    SELECT COUNT(*) FROM table1 t1 
    INNER JOIN table2 t2 ON t2.id = t1.rowid 
    WHERE t1.flag1 = true AND t2.flag2 = false) tab2 
Questions connexes