SQL:SELECT DISTINCT不返回不同的值

时间:2015-11-14 00:59:20

标签: sql sql-server distinct reportbuilder3.0

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

当前输出

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

1 个答案:

答案 0 :(得分:1)

简而言之 - 从SQL角度来看,使用DISTINCT的方式在逻辑上是错误的。

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

我会通过以下检查步骤:

  • 查看外部JOIN ON部分中是否存在FROM条件不足导致数据倍增(例如,如果表具有主对外密钥)在几个列上的关系,但你只在其中一个列上加入。)。
  • 检查外部FROM部分中哪些来源包含非不同记录 - 然后清理您的来源,或者调整JOIN条件和/或WHERE子句以便您只选择不同的&amp;正确的记录。实际上,您可能需要在SELECT DISTINCT部分中FROM - 在那里它会更有意义。