1

我有两个 SQL SELECT COUNT 语句:

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;

可以看出,这两个语句的唯一区别是翻转条件。

但我想要做的是将这两个语句组合成一个,这样输出就变成一个有两列的表,第一列包含第一个语句的结果,第二列包含第二个语句的结果。就像是:

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

顺便说一句,我使用 PostgreSQL。有人可以让我知道该怎么做吗?

非常感谢

4

3 回答 3

4

这应该为你做。我对 PostgreSql 不熟悉,但我认为它会起作用。

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
于 2013-02-04T11:43:50.303 回答
3

如果你真的需要这种方式(使用两个 sql 查询并将它们组合起来),那么:

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

根据您的 SQL,这将是更好的解决方案:

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

您还可以将布尔类型转换为整数并缩短 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

因为 true > false 和 false < true (至少在 PostgreSQL 中)你可以写:

 select 
    sum((flag1 < flag2)::int) count1,
    sum((flag1 > flag2)::int) count2    
 from
    table1 t1 
    join table2 t2 ON t2.id = t1.rowid
于 2013-02-04T11:41:53.843 回答
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
于 2013-02-04T11:47:41.273 回答