2015-11-14 54 views
1

下面的代码应该从子查询返回lp_num字段中的唯一记录,然后在外部查询中使用,但我仍然获得lp_num字段的倍数。 ReferenceNumber可以有多个ApptDate记录,但每个lp_num只能有1个rf_num。这就是为什么我试图在子查询中一直检索唯一的lp_num记录,但它不起作用。我正在使用Report Builder 3.0。SQL:SELECT DISTINCT不返回不同的值

电流输出

Screenshot

所需的输出将有在lp_num领域的唯一记录。这是因为lp_num字段中的每个值都是一个托盘,一个托盘。右侧的信息是何时到达(ApptDate)以及交付的参考号码(ref_num)。因此,这是没有意义的托盘有多个收货日期......它只能到达一次......

SELECT DISTINCT 
       dbo.ISW_LPTrans.item, 
       dbo.ISW_LPTrans.lot, 
       dbo.ISW_LPTrans.trans_type, 
       dbo.ISW_LPTrans.lp_num, 
       dbo.ISW_LPTrans.ref_num, 
       (MIN(CONVERT(VARCHAR(10),dbo.CW_CheckInOut.ApptDate,101))) as appt_date_only, 
       dbo.CW_CheckInOut.ApptTime, 
       dbo.item.description, 
       dbo.item.u_m, 
       dbo.ISW_LPTrans.qty, 
       (CASE 
        WHEN dbo.ISW_LPTrans.trans_type = 'F' 
        THEN 'Produced internally' 
         ELSE 
          (CASE 
           WHEN dbo.ISW_LPTrans.trans_type = 'R' 
            THEN 'Received from outside' 
          END) 
          END 
       ) as original_source 

FROM 
    dbo.ISW_LPTrans 
    INNER JOIN dbo.CW_Dock_Schedule ON LTRIM(RTRIM(dbo.ISW_LPTrans.ref_num)) = dbo.CW_Dock_Schedule.ReferenceNumber 
    INNER JOIN dbo.CW_CheckInOut ON dbo.CW_CheckInOut.TruckID = dbo.CW_Dock_Schedule.TruckID 
    INNER JOIN dbo.item ON dbo.item.item = dbo.ISW_LPTrans.item 

WHERE 
    (dbo.ISW_LPTrans.trans_type = 'R') AND 
     --CONVERT(VARCHAR(10),dbo.CW_CheckInOut.ApptDate,101) <= CONVERT(VARCHAR(10),dbo.ISW_LPTrans.trans_date,101) AND    
       dbo.ISW_LPTrans.lp_num IN 
    (SELECT DISTINCT 
     dbo.ISW_LPTrans.lp_num 
      FROM 
      dbo.ISW_LPTrans 
      INNER JOIN dbo.item ON dbo.ISW_LPTrans.item = dbo.item.item 
      INNER JOIN dbo.job ON dbo.ISW_LPTrans.ref_num = dbo.job.job AND dbo.ISW_LPTrans.ref_line_suf = dbo.job.suffix 
     WHERE 
      (dbo.ISW_LPTrans.trans_type = 'W' OR dbo.ISW_LPTrans.trans_type = 'I') AND 
      dbo.ISW_LPTrans.ref_num IN 
      (SELECT 
       dbo.ISW_LPTrans.ref_num 
       FROM 
       dbo.ISW_LPTrans 
       --INNER JOIN dbo.ISW_LPTrans on dbo.ISW_LPTrans. 
       WHERE 
       dbo.ISW_LPTrans.item LIKE @item AND 
       dbo.ISW_LPTrans.lot LIKE @lot AND 
       dbo.ISW_LPTrans.trans_type = 'F' 
       GROUP BY 
       dbo.ISW_LPTrans.ref_num 
       ) AND 
       dbo.ISW_LPTrans.ref_line_suf IN 
       (SELECT 
       dbo.ISW_LPTrans.ref_line_suf 
       FROM 
       dbo.ISW_LPTrans 
       --INNER JOIN dbo.ISW_LPTrans on dbo.ISW_LPTrans. 
       WHERE 
       dbo.ISW_LPTrans.item LIKE @item AND 
       dbo.ISW_LPTrans.lot LIKE @lot AND 
       dbo.ISW_LPTrans.trans_type = 'F' 
       GROUP BY 
       dbo.ISW_LPTrans.ref_line_suf 
       )    
       GROUP BY 
       dbo.ISW_LPTrans.lp_num 
       HAVING 
       SUM(dbo.ISW_LPTrans.qty) < 0 
       ) 
       GROUP BY 
       dbo.ISW_LPTrans.item, 
       dbo.ISW_LPTrans.lot, 
       dbo.ISW_LPTrans.trans_type, 
       dbo.ISW_LPTrans.lp_num, 
       dbo.ISW_LPTrans.ref_num, 
       dbo.CW_CheckInOut.ApptDate, 
       dbo.CW_CheckInOut.ApptTime, 
       dbo.item.description, 
       dbo.item.u_m, 
       dbo.ISW_LPTrans.qty   
      ORDER BY 
       dbo.ISW_LPTrans.lp_num 
+0

仅仅因为内部子查询包含唯一结果并不意味着外部查询将同样受到限制。根据需要,您也必须在外部查询中使用“DISTINCT”(或“GROUP BY”)。 – Dai

+1

例如,如果内部查询返回('1,2,3'),则外部查询仍可以包含('1,1,2,2,3,3,3,3,3'),这是可以的,因为每个外部查询值都位于内部查询值中。 – Dai

+0

在外部查询中使用GROUP BY强制我将所有外部字段放在该子句中(否则它会给我一个错误),因此将返回唯一lp_num值的功能取消,因为对于每个lp_num - > ref_num - > apt_date_only每1个lp_num有3个apt_date_only(对于某些记录)。 – whatwhatwhat

回答

1

简而言之 - 你用DISTINCT是从SQL的角度逻辑错误的方式。

您的DISTINCT位于WHERE子句中的IN子查询中 - 并且在该代码点,它绝对没有任何影响(性能损失除外)。考虑一下 - 如果外部查询返回非唯一值dbo.ISW_LPTrans.lp_num(发生这种情况),那些值仍然可以在IN子查询的不同值内 - IN不强制执行1对1匹配,而只是强制执行外部查询值在内部值内的事实,但它们可以匹配多次。所以绝对不是DISTINCT的错。

过会通过下面的检查步骤:

  • 查看是否有不足JOIN ON条件(一个或多个)在外FROM部通向数据乘法(例如,如果一个表有初级到 - 在几列上的外键关系,但你只加入其中之一等)。
  • 检查其来源包含非重复的记录外FROM部分 - 那么无论净化源,或调整JOIN条件和/或WHERE子句,所以你只挑选不同&正确的记录。实际上,您可能需要FROM部分中的SELECT DISTINCT - 在那里它会更有意义。
+0

明白了。 dbo.ISW_LPTrans有字段Uf_TruckID,我需要在dbo.CW_Dock_Schedule.TruckID(该表的primray键......)上“INNER JOIN” – whatwhatwhat