5

誰かがApacheDerbySQLのSQLクエリを手伝って、「単純な」カウントを取得できますか。

このようなテーブルABCが与えられます...

    
    id abc
    1 1 1 1
    2 1 1 2
    3 2 1 3
    4 2 1 1
** 5 2 1 2 **
** 6 2 2 1 **
    7 3 1 2
    8 3 1 3
    9 3 1 1

'a'の異なる値が(b=1とc=2)AND(b=2とc=1)の両方を持ち、1の正しい結果を得る方法のカウントを取得するクエリを作成するにはどうすればよいですか?マークされた2つの行が基準に一致し、両方の値がa = 2である場合、このテーブルには基準に一致するaの値が1つだけあります)

トリッキーな点(b=1 and c=2) AND (b=2 and c=1)は、単一の行に適用すると明らかに相互に排他的であるということです。..では、その式をaの個別の値の複数の行に適用するにはどうすればよいですか?

これらのクエリは間違っていますが、私がやろうとしていることを説明するために...
SELECT DISTINCT COUNT(a) WHERE b=1 AND c=2 AND b=2 AND c=1 ...
..(0)相互に排他的
SELECT DISTINCT COUNT(a) WHERE b=1 AND c=2 OR b=2 AND c=1 ...
ではありません..(3)間違った結果が得られます。
SELECT COUNT(a) (CASE WHEN b=1 AND c=10 THEN 1 END) FROM ABC WHERE b=2 AND c=1
..(0)相互に排他的ではありません

乾杯、フィル。

4

3 に答える 3

7

(a、b、c)は一意だと思います。これを行う1つの方法は、自己結合を使用することです。

SELECT COUNT(*)
FROM   ABC T1
JOIN   ABC T2
ON     T1.a = T2.a
WHERE  T1.b = 1 AND T1.c = 2
AND    T2.b = 2 AND T2.c = 1

これは概念的に次のように機能します。

  • を満たすすべての行を検索します(b,c) = (1,2)
  • を満たすすべての行を検索します(b,c) = (2,1)
  • aが同じ場合は、上記の2つのセットを結合します。
  • 結合された結果の行数を数えます。

理解しやすい別の方法は、副選択を使用することです。

SELECT COUNT(*)
FROM   ABC
WHERE  a IN (SELECT a FROM ABC
             WHERE  b = 2
             AND    c = 1)
AND    b = 1
AND    c = 2

注:(a、b、c)の値が重複している可能性がある場合は、最初のクエリと2番目のクエリでSELECT COUNT(*)使用する代わりに。SELECT COUNT(DISTINCT T1.a)SELECT COUNT(DISTINCT a)

これらのクエリは、Apache DerbyではなくMySQLでテストされていますが、そこでも機能することを願っています。

于 2010-05-16T22:13:26.700 に答える
1

Apache DerbyのSQLサポートページによると、Markの2番目のクエリは実際にApacheDerbyによってサポートされているはずです。

SELECT COUNT(DISTINCT a) FROM ABC
 WHERE b = 1 AND c = 2
   AND a IN (SELECT a FROM ABC WHERE b = 2 AND c = 1);

自己結合バージョンよりも読みやすいだけでなく、結合を実行する必要があるというオーバーヘッドを回避できるため、高速になるはずです。

于 2010-05-17T00:42:09.633 に答える
0

トリッキーな点は、(b=1およびc=2)AND(b=2およびc=1)は、単一の行に適用された場合、明らかに相互に排他的であるということです。

まさにそうです。レコードのセットについて考えるときは、行の個別の「a」値の数が必要です。これを試して:(b = 1 and c = 2) OR (b = 2 and c = 1)

SELECT COUNT(DISTINCT a) FROM "abc" WHERE (b=1 OR c=2) OR (b=2 OR c=1)
于 2010-05-17T00:06:12.887 に答える