1

2つのSQLSELECTCOUNTステートメントがあります。

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;

見てわかるように、これら2つのステートメントの唯一の違いは反転状態です。

しかし、私がやりたいのは、2つのステートメントを1つに結合して、出力が2つの列を持つ1つのテーブルになり、最初の列に最初のステートメントの結果が含まれ、2番目の列に2番目のステートメントの結果が含まれるようにすることです。何かのようなもの:

   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

この方法で本当に必要な場合(2つの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 に答える