只想 return 组内具有重复 unitid 的行按 unitid

Only want to return rows that have duplicate unitid within group by unitid

我正在使用 SSRS 查询 Oracle 数据库。

所以我有一个数据源,此报告应该根据唯一 unitid 上的多个打开的工单查找重复的工单。所以我只想显示具有多个条目的组,因为它们是按 unitid 分组的。

 SELECT
 COMPSTSB.UNITID,
 COMPSTSB.UNITTYPE,
 ACTDEFN.ACTDESC,
 ACTDEFN.ACTCODE,
 HISTORY.WONO, 
 HISTORY.COMPFLAG,
 HISTORY.ADDDTTM,
 HISTORY.COMMENTS
 FROM   (IMSV7.COMPSTSB COMPSTSB INNER JOIN IMSV7.HISTORY HISTORY ON
 COMPSTSB.COMPKEY=HISTORY.COMPKEY) INNER JOIN IMSV7.ACTDEFN ACTDEFN ON 
 HISTORY.ACTKEY=ACTDEFN.ACTKEY
 WHERE  HISTORY.COMPFLAG='Y' AND  NOT (ACTDEFN.ACTCODE='DBR' OR     ACTDEFN.ACTCODE='IN')
 ORDER BY COMPSTSB.UNITTYPE, COMPSTSB.UNITID, HISTORY.ADDDTTM

谁能指出我正确的方向?是的,在有人说这个问题被问了一百万次之前,我确实进行了搜索。将我指向一百万次,我会看看我是否觉得它们符合我的问题。理想情况下,在 SQL 中,我可以创建返回 unitid 计数的新列,我确实尝试过但失败了,然后我可以对该列进行过滤以删除任何只有一个计数的列。我真的不认为这应该很难,但到目前为止我已经花了大约 4 个小时。

提前致谢! 史蒂文

我想您担心 UNITIDIMSV7.COMPSTSB table 中有重复的值。如果是这样,将此连接添加到您的查询中应该可以让您识别它们:

 JOIN (SELECT COMPSTSB.UNITID
         FROM IMSV7.COMPSTSB
        GROUP BY COMPSTSB.UNITID
       HAVING COUNT(COMPSTSB.UNITID) > 1) dups
   ON DUPS.UNITID = COMPSTSB.UNITID
 JOIN IMSV7.HISTORY HISTORY

完整查询如下:

 SELECT COMPSTSB.UNITID
      , COMPSTSB.UNITTYPE
      , ACTDEFN.ACTDESC
      , ACTDEFN.ACTCODE
      , HISTORY.WONO
      , HISTORY.COMPFLAG
      , HISTORY.ADDDTTM
      , HISTORY.COMMENTS
   FROM IMSV7.COMPSTSB COMPSTSB
   JOIN (SELECT COMPSTSB.UNITID
           FROM IMSV7.COMPSTSB
          GROUP BY COMPSTSB.UNITID
         HAVING COUNT(COMPSTSB.UNITID) > 1) dups
     ON DUPS.UNITID = COMPSTSB.UNITID
   JOIN IMSV7.HISTORY HISTORY
     ON COMPSTSB.COMPKEY = HISTORY.COMPKEY
   JOIN IMSV7.ACTDEFN ACTDEFN
     ON HISTORY.ACTKEY = ACTDEFN.ACTKEY
  WHERE HISTORY.COMPFLAG = 'Y'
    AND ACTDEFN.ACTCODE NOT IN ('DBR','IN')
  ORDER BY COMPSTSB.UNITTYPE
      , COMPSTSB.UNITID
      , HISTORY.ADDDTTM;

由于上述查询不起作用,您可以尝试对每个 table 的类似子查询进行外部联接,并限制为仅外部联接 table [=21= 的记录] 数据。这将向您显示查询中的哪些 table 引起了额外的行。:

 SELECT COMPSTSB.UNITID
      , COMPSTSB.UNITTYPE
      , ACTDEFN.ACTDESC
      , ACTDEFN.ACTCODE
      , HISTORY.WONO
      , HISTORY.COMPFLAG
      , HISTORY.ADDDTTM
      , HISTORY.COMMENTS
      , DUPS.UNITID UNITID_DUP
      , DUPS2.COMPKEY COMPKEY_DUP
      , DUPS3.ACTKEY ACTKEY_DUP
   FROM IMSV7.COMPSTSB COMPSTSB
   JOIN IMSV7.HISTORY HISTORY
     ON COMPSTSB.COMPKEY = HISTORY.COMPKEY
   JOIN IMSV7.ACTDEFN ACTDEFN
     ON HISTORY.ACTKEY = ACTDEFN.ACTKEY
   LEFT JOIN (SELECT COMPSTSB.UNITID
           FROM IMSV7.COMPSTSB
          GROUP BY COMPSTSB.UNITID
         HAVING COUNT(COMPSTSB.UNITID) > 1) dups
     ON DUPS.UNITID = COMPSTSB.UNITID
   LEFT JOIN (SELECT HISTORY.COMPKEY
           FROM IMSV7.HISTORY
          GROUP BY HISTORY.COMPKEY
         HAVING COUNT(HISTORY.COMPKEY) > 1) dups2
     ON DUPS.UNITID = COMPSTSB.UNITID
   LEFT JOIN (SELECT ACTDEFN.ACTKEY
           FROM IMSV7.ACTDEFN
          GROUP BY ACTDEFN.ACTKEY
         HAVING COUNT(ACTDEFN.ACTKEY) > 1) dups3
     ON DUPS.UNITID = COMPSTSB.UNITID
  WHERE HISTORY.COMPFLAG = 'Y'
    AND ACTDEFN.ACTCODE NOT IN ('DBR','IN')
    AND ( DUPS.UNITID   IS NOT NULL OR
          DUPS2.COMPKEY IS NOT NULL OR
          DUPS3.ACTKEY  IS NOT NULL)
  ORDER BY COMPSTSB.UNITTYPE
      , COMPSTSB.UNITID
      , HISTORY.ADDDTTM;

如果我对你的问题的理解是正确的,那么下面应该可以满足你的需求:

SELECT * FROM 
(
 SELECT
 COMPSTSB.UNITID,
 COMPSTSB.UNITTYPE,
 ACTDEFN.ACTDESC,
 ACTDEFN.ACTCODE,
 HISTORY.WONO, 
 HISTORY.COMPFLAG,
 HISTORY.ADDDTTM,
 HISTORY.COMMENTS,
 COUNT(1) OVER (PARTITION BY COMPSTSB.UNITID) AS numDups
 FROM   (IMSV7.COMPSTSB COMPSTSB INNER JOIN IMSV7.HISTORY HISTORY ON
 COMPSTSB.COMPKEY=HISTORY.COMPKEY) INNER JOIN IMSV7.ACTDEFN ACTDEFN ON 
 HISTORY.ACTKEY=ACTDEFN.ACTKEY
 WHERE  HISTORY.COMPFLAG='Y' AND  NOT (ACTDEFN.ACTCODE='DBR' OR     ACTDEFN.ACTCODE='IN')
 )a
 WHERE a.numDups >1 
 ORDER BY COMPSTSB.UNITTYPE, COMPSTSB.UNITID, HISTORY.ADDDTTM