2017-05-17 13 views
0

テーブルのテーブルAがフィールドidA_1-3のテーブルBにいくつ存在し、0を出力にnullで置き換えたいのですか? SQL別のテーブルの複数のフィールドをカウントする

A  B 
idA  idB idA_1 idA_2 idA_3 
1  1  2  3  3 
2  2  2  3  3 
3  3  1  3  2 
     4  3  1  2 
     5  1  1  2 

は、所望の出力

idA  cA_1 cA_2 cA_3 
1  2  2  
2  2   3 
3  1  3  2 

CA_1は、以下のように見えますが、私はより多くの列が含まれるようにそれを変更することができなかっただけカウントクエリ:

SELECT IdA, COUNT(*) AS cA_1 FROM 
(SELECT A.IdA, B.IdB 
FROM A LEFT JOIN B ON A.IdA = B.IdA_1) 
WHERE IdB IS NOT NULL 
GROUP BY IdA 
UNION ALL SELECT IdA, NULL AS cA_1 FROM 
(SELECT A.IdA, B.IdB 
FROM A LEFT JOIN B ON A.IdA = B.IdA_1) 
WHERE IdB IS NULL 
GROUP BY IdA; 

もオプションがありますIIFとなりますが、遅すぎます。

SELECT A.IdA, IIf((SELECT COUNT(*) FROM B WHERE IdA_1 = A.IdA)=0, NULL, (SELECT COUNT(*) FROM B WHERE IdA_1 = A.IdA)) AS cA_1 
FROM A; 

答えて

0

私は、相関サブクエリを示唆している:

select a.id, 
     (select count(*) from b where b.idA_1 = a.id) as a_1, 
     (select count(*) from b where b.idA_2 = a.id) as a_2, 
     (select count(*) from b where b.idA_3 = a.id) as a_3 
from a; 

あなたは0にNULL秒に変換するために使用iif()を使用することができます。

select id, iif(a_1 > 0, a_1, NULL) as a_1, 
     iif(a_2 > 0, a_2, NULL) as a_2, 
     iif(a_3 > 0, a_3, NULL) as a_3 
from (select a.id, 
      (select count(*) from b where b.idA_1 = a.id) as a_1, 
      (select count(*) from b where b.idA_2 = a.id) as a_2, 
      (select count(*) from b where b.idA_3 = a.id) as a_3 
     from a 
    ) as a; 

は、ほとんどのデータベースはnullif()と呼ばれる機能がありますが、私はしないでくださいMS Accessに対応する機能があると思う。

+0

2番目の例の最初の選択で循環参照を避けるために、マイナーな修正(id - > idAとa_1-3 - > cA_1-3を変更する)のように動作します。 – user0

関連する問題