2014-09-04 81 views
0

我想在3个表来算几个项目:伯爵独有的3排连接表

  • “总” - 总Serialnumbers在一个批次(批号为SERIALNUMBER的3个第一位数)
  • “Call_Per_Code” - 与每批
  • “NoCall”一个callnr计数唯一代码 - 计数唯一代码没有callnr每批

样本数据如下:

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 

的结果必然是:

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

但我得到的结果是:

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

我使用的是SQL Server 2012中的SQL代码:

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) 

我如何获得Call_Per_Code列的正确计数。用CallNr代码201401被算作如果从Test3的开始的3改为1,

回答

1

此查询获取一个容易得多 - 你甚至都不需要加入到测试1,如果你从那里开始:

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)