SQL:SELECT DISTINCT 不返回不同的值

标签 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

最佳答案

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

您的 DISTINCT 位于 WHERE 子句的 IN 子查询中 - 在代码的那个点它绝对没有效果(除了性能损失)。想一想 - 如果外部查询返回 dbo.ISW_LPTrans.lp_num 的非唯一值(这很明显),这些值仍然可以在 IN 的不同值内子查询 - IN 不强制执行一对一匹配,它只强制执行外部查询值在内部值内的事实,但它们可以匹配多次。所以这绝对不是 DISTINCT 的错。

我将执行以下检查步骤:

  • 查看外部 FROM 部分是否存在导致数据乘法的不足 JOIN ON 条件(例如,如果一个表在多个列上有主键到外键的关系,但您只加入其中一个等)。
  • 检查哪些来源包含外部 FROM 部分中的非独特记录 - 然后清理您的来源,或调整 JOIN 条件和/或 WHERE 子句这样您就可以只选择不同且正确的记录。事实上,您可能需要在 FROM 部分中选择 SELECT DISTINCT - 这样会更有意义。

关于SQL:SELECT DISTINCT 不返回不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33704010/

相关文章:

mongodb 计数并删除重复值

针对多个条件的不同记录的 SQL 计数

sql - 获取已排序的数据库记录子集的最佳方法

sql - 消除 SELECT DISTINCT 中的 NULL 的最简单方法?

sql - 是否可以一次将整个 VB.NET DataTable 插入 SQL Server

sql - 如何选择数字随着日期增加而减少的行

PHP/SQL : SELECT 2 columns 3 times with different values

sql - 我可以在 T-SQL SELECT 中定义循环变量(如 LINQ 中的 LET)吗?

MySQL - 使用另一个表中的列对行进行排序并且不重复数据

sql - 缩短 GROUP BY 子句