0

手っ取り早く、

次の構造のテーブルがあります

id  lid  taken
1   1    0
1   1    0
1   1    1
1   1    1
1   2    1

これまでのところ、かなり簡単ですか?

1 のふたから取得/利用可能を照会する必要があります。これは返されるはずです

taken  available
2      2

単純に 2 つのカウントを実行してそれらを結合できることはわかっていますが、2 つの別々のクエリではなく、これを行うためのより熟練した方法はありますか?

私は次のタイプのフォーマットを見ていましたが、私の人生ではSQLで実行することはできません...

SELECT
   COUNT(case taken=1) AS taken, 
   COUNT(case taken=0) AS available FROM table
WHERE 
   lid=1

どうもありがとうございます。

4

4 に答える 4

3

あなたはこれを行うことができます:

SELECT taken, COUNT(*) AS count
FROM table
WHERE lid = 1
GROUP BY taken

これにより、2つの行が返されます。

taken  count
0      2
1      2

taken各カウントは、その特定の値が表示された回数に対応します。

于 2012-06-13T15:23:11.190 に答える
2

あなたのクエリは正しいです:

SELECT
   SUM(case taken WHEN 1 THEN 1 ELSE 0 END) AS taken, 
   SUM(case taken WHEN 1 THEN 0 ELSE 1 END) AS available FROM table
WHERE 
   lid=1

または、次のこともできます。

SELECT
   SUM(taken) AS taken, 
   COUNT(id) - SUM(taken) AS available 
FROM table
WHERE 
   lid=1
于 2012-06-13T15:24:11.547 に答える
1
SELECT
   SUM(case WHEN taken=1 THEN 1 ELSE 0 END) AS taken, 
   SUM(case WHEN taken=0 THEN 1 ELSE 0 END) AS available 
FROM table
WHERE lid=1
于 2012-06-13T15:24:46.803 に答える
1

CTE の奇妙な適用:

WITH lid AS (
        SELECT DISTINCT lid FROM taken
        )
, tak AS (
        SELECT lid,taken , COUNT(*) AS cnt
        FROM taken t0
        GROUP BY lid,taken
        )
SELECT l.lid
, COALESCE(a0.cnt, 0) AS available
, COALESCE(a1.cnt, 0) AS taken
FROM lid l
LEFT JOIN tak a0 ON a0.lid=l.lid AND a0.taken = 0
LEFT JOIN tak a1 ON a1.lid=l.lid AND a1.taken = 1
WHERE l.lid=1
        ;
于 2012-06-13T15:35:37.827 に答える