2017-02-05 7 views
1

すべての行の数をカウントしたいcomponistId。私は、次のSQL文を実行すると、それが正常に動作します:カウント0の行を表示しないでグループ化する

SELECT C.componistId, COUNT(*) 
FROM Componist C LEFT JOIN Stuk S ON S.componistId = C.componistId 
GROUP BY C.componistId 

は、今私はstukNrOrigineel

SELECT C.componistId, COUNT(*) 
FROM Componist C LEFT JOIN Stuk S ON S.componistId = C.componistId 
WHERE S.stuknrOrigineel IS NULL 
GROUP BY C.componistId 

nullである行だけをしたいしかし、私はこれを行うとき、0の結果とのすべての行が消えます。 1行以上の行のみが表示されます。どうすればこの作品を作れますか?

答えて

1

あなたはon句で条件を含める必要があります。

SELECT C.componistId, COUNT(C.componistId) 
FROM Componist C LEFT JOIN 
    Stuk S 
    ON S.componistId = C.componistId AND 
     S.stuknrOrigineel IS NULL 
GROUP BY C.componistId; 

注:私は2番目のテーブルからカウントするCOUNT()を変更しました。これは通常、LEFT JOINCOUNT()を組み合わせるときに必要なものです。

一部のデータベースでは、上記の内容が期待通りに機能しない可能性があります(Sの条件がLEFT JOINの前または後に評価されるかどうかは疑問です)。これは常に動作するはずです:

SELECT C.componistId, COUNT(s.componistId) 
FROM Componist C LEFT JOIN 
    (SELECT S.* FROM Stuk S WHERE S.stuknrOrigineel IS NULL 
    ) s 
    ON S.componistId = C.componistId AND 
GROUP BY C.componistId; 

別の一般的な解決策は、集約関数に条件を移動している:

SELECT C.componistId, 
     SUM(CASE WHEN S.stuknrOrigineel IS NULL THEN 1 ELSE 0 END) 
FROM Componist C LEFT JOIN 
    Stuk S 
    ON S.componistId = C.componistId 
GROUP BY C.componistId; 
+0

私はこれを試してみましたが、その後、それはそれは、結果がnullながら、ある行に1行を持っていると言います0 – Sjoerd

+0

@Sjoerdである必要があります。 。 。編集したバージョンの質問のように、引数を 'COUNT()'に固定することで修正します。 –

+0

最初のものは動作しませんが、もう1つは動作しません。なぜなのかご存知ですか?私は学校のためにこれを作っています。私はその2番目の方法を学んでいないので、最初の方法でも何とかしてはならないと思います。 – Sjoerd

関連する問題