Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:选择DISTINCT不返回DISTINCT值_Sql_Sql Server_Distinct_Reportbuilder3.0 - Fatal编程技术网

SQL:选择DISTINCT不返回DISTINCT值

SQL:选择DISTINCT不返回DISTINCT值,sql,sql-server,distinct,reportbuilder3.0,Sql,Sql Server,Distinct,Reportbuilder3.0,下面的代码应该从子查询返回lp_num字段中的唯一记录,然后用于外部查询,但我仍然得到lp_num字段的倍数。一个ReferenceNumber可以有多个ApptDate记录,但每个lp_num只能有一个rf_num。这就是为什么我一直试图在子查询中检索唯一的lp_num记录,但它不起作用。我正在使用报表生成器3.0 电流输出 期望的输出是在lp_num字段中只有唯一的记录。这是因为lp_num字段中的每个值都是一个工作台,一个工作台。右边的信息是它到达的时间(ApptDate)和交付的参考号

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

电流输出

期望的输出是在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
选择DISTINCT
dbo.ISW_LPTrans.item,
dbo.ISW_LPTrans.lot,
dbo.ISW_LPTrans.trans_类型,
dbo.ISW_LPTrans.lp_num,
dbo.ISW_LPTrans.ref_num,
(最小值(转换为(VARCHAR(10),dbo.CW\u CheckInOut.ApptDate,101)))仅作为appt\u日期,
dbo.CW_CheckInOut.ApptTime,
dbo.item.description,
dbo.item.um,
dbo.ISW\U LPTrans.qty,
(案例
当dbo.ISW_LPTrans.trans_type='F'
然后“内部生产”
其他的
(案例
当dbo.ISW_LPTrans.trans_type='R'
然后“从外部接收”
(完)
结束
)作为原始来源
从…起
dbo.ISW_LPTrans
LTRIM上的内部联接dbo.CW_Dock_调度(RTRIM(dbo.ISW_LPTrans.ref_num))=dbo.CW_Dock_调度。参考编号
dbo.CW\u CheckInOut.TruckID=dbo.CW\u Dock\u Schedule.TruckID上的内部联接dbo.CW\u CheckInOut
dbo.item.item=dbo.ISW\u LPTrans.item上的内部联接dbo.item
哪里
(dbo.ISW_LPTrans.trans_type='R')和

--CONVERT(VARCHAR(10),dbo.CW_CheckInOut.ApptDate,101)简而言之,从SQL的角度来看,使用
DISTINCT
的方式在逻辑上是错误的

您的
DISTINCT
位于
WHERE
子句中的
in
子查询中,并且在代码的这一点上,它绝对没有影响(性能惩罚除外)。仔细想想-如果外部查询返回的非唯一值
dbo.ISW_LPTrans.lp_num
(很明显发生了这种情况),那么这些值仍然可以在子查询中
的不同值范围内-在
不强制执行1对1匹配,它只强制执行外部查询值在内部值范围内的事实,但它们可以匹配多次。所以这绝对不是
明显的
的错

我将执行以下检查步骤:

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

仅仅因为内部子查询包含唯一的结果,并不意味着外部查询将受到类似的限制。在外部查询中也必须使用
DISTINCT
(或
GROUP BY
)。例如,如果内部查询返回(
1,2,3
),则外部查询仍然可以包含(
1,1,2,2,3,3,3,3,3
),这没关系,因为每个外部查询值都在内部查询值中。在外部查询中使用
GROUP BY
会迫使我将所有外部字段都放在该子句中(否则会产生错误),因此,取消返回唯一lp_num值的功能,因为对于每个lp_num->ref_num->apt_date_,对于每1个lp_num(对于某些记录),只有3个apt_date_。在外部查询中使用
DISTINCT
会给我一个错误:单词
DISTINCT
附近的语法不正确。这发生在我直接在dbo.ISW_LPTrans.lp_num的左边添加了
DISTINCT
时(当然带有空格)显示您正在获得的输出,并显示您期望的输出,我们可以提供帮助。明白了。dbo.ISW\u LPTrans有一个字段Uf\u TruckID,我需要它在dbo.CW\u Dock\u Schedule.TruckID(该表的primray键…)上
内部连接