2014-09-04 1 views
0

Je voudrais compter plusieurs articles dans les 3 tables:Count lignes uniques de 3 tables de jointure

  • "Total" - Les Serialnumbers au total dans un lot (batch est les 3 premiers chiffres du Numéro de série)
  • "Call_Per_Code" - Compter les codes uniques avec un callnr pour chaque lot
  • "NOCALL" - Compter les codes uniques sans callnr pour chaque lot

données exemples ci-dessous:

Table Test1 
CallNr  CallType 
1   rej 
2   rej 
3   rej 
4   rej 
5   QC 
6   QC 
7   rej 
8   rej 

Table Test2 
CallNr  Code 
1   201401 
3   201402 
4   201404 
5   201401 
7   201401 
8   201401 

Table Test3 
Code PartCode SerialNumber 
201401 68001  123-01 
201402 68001  123-02 
201403 68001  123-03 
201404 68001  124-01 
201405 68001  124-02 
201406 68001  124-03 

Le résultat doit être:

Batch Total NoCall Call_Per_Code 
123 3  1  2 
124 3  2  1 

Mais j'obtenir le résultat:

Batch Total NoCall Call_Per_Code 
123 3  1  4 
124 2  1  1 

J'utilise le code SQL sur SQL Server 2012:

SELECT 
    substring(T3.SerialNumber,1,3) as batch 
    ,COUNT(DISTINCT concat(T3.code,substring(T3.SerialNumber,1,3))) as Total 
    ,sum(case when T2.CallNr is null then 1 else 0 end) as NoCall 
    ,sum(case when T2.CallNr is null then 0 else 1 end) as Call_per_Code 
FROM Test1 T1 
    INNER JOIN Test2 T2 
     ON T1.CallNr=T2.CallNr AND T1.CallType='rej' 
    RIGHT JOIN Test3 T3 
     ON T2.Code=T3.Code 
GROUP BY substring(T3.SerialNumber,1,3) 

Comment puis-je obtenir le compte correct sur la colonne Call_Per_Code. Le code 201401 avec un CallNr est compte que 3 au lieu de 1.

Répondre

1

Cette requête devient beaucoup plus facile si vous commencez à partir Test3 - vous ne même pas besoin de se joindre à si vous commencez Test1 à partir de là:

SELECT 
    SUBSTRING(T3.SerialNumber, 1, 3) AS Batch, 
    COUNT(DISTINCT T3.Code) AS Total, 
    SUM(CASE WHEN T2.CallNr IS NULL THEN 1 ELSE 0 END) AS NoCall, 
    COUNT(DISTINCT T2.Code) AS Call_Per_Code 
FROM Test3 T3 
    LEFT OUTER JOIN Test2 T2 ON T3.Code = T2.Code 
GROUP BY SUBSTRING(T3.SerialNumber, 1, 3) 
Questions connexes