4

我有一个名为 ServiceRequest 的表。请参阅下面的一些记录和列。

RowID   Type    Area    IntID  OwnerBussUnit
1       AB      DD1     1234   Abc
2       AB      EE2     7635   Abc
3       CD      DD1     1234   Bde
4       FE      FF3     2423   Gte
5       AB      DD1     1234   Abc 
6       CD      DD1     6363   Sde
7       TT      QQ6     7635   Sde
8       AB      DD1     9998   Dfr
9       AB      DD1     9998   Red

1) 列出它们我想列出在 IntID 列中具有重复值的记录。结果中的每条记录都应具有:

  • #IntID:重复IntID的计数次数(所以可以多于两次)
  • #GroupBy:重复 IntID 为“Type”和“Area”列的组合计算的次数
  • 同一所有者;其中,在 Type 和 Area 的分组中,OwnerBussUnit 具有相同的值
  • 差异所有者;其中,在Type和Area的分组中,OwnerBussUnit不具有相同的值Order by IntID, RowID

我正在寻找的结果如下:

IntID  RowID   Type  Area  #IntID  #GroupBy   SameOwner   DiffOwner
1234   1       AB    DD1   3       2           Yes         No
1234   3       CD    DD1   3       1           Yes         No
1234   5       AB    DD1   3       2           Yes         No
7635   2       AB    EE2   2       1           No          Yes
7635   7       TT    OO6   2       1           No          Yes
9998   8       AB    DD1   2       2           No          Yes
9998   9       AB    DD1   2       2           No          Yes

2) 计数它们计数按类型和区域分组的重复 IntID。所以结果看起来像:

Type  Area  #IntID
AB    DD1     4
CD    DD1     1
AB    EE2     1
TT    OO6     1 

我如何在 SQL(在 DB2 中)中做到这一点?

4

2 回答 2

3

2号)。

select area, type, count(*) from servicerequest group by area, type
于 2013-11-14T15:45:18.377 回答
2

1)

首先,我们需要找到重复的值,然后是具有这些 IntID 值的行,按区域和类型进行分组,然后将该信息与各个行结合起来。公用表表达式 (CTE) 简化了像这样的阶段的工作。在这个例子中,i将引用第一个子查询,我们在其中找到哪些 IntID 有重复,g第二个子查询是我们获取组信息的地方。

with i as
( select IntId,
         count(*) as tally
    from ServiceRequest
    group by IntID
    having count(*)>1
), g as
( select j.IntId, j.Area, j.Type,
         count(*) as tally,
         count(distinct j.OwnerBussUnit) as owners
    from ServiceRequest j
    join                i   on i.IntID=j.IntID
    group by j.IntId, j.Area, j.Type
)
select x.IntID, x.RowID, x.Type, x.Area,
       i.tally as "#IntID"
       g.tally as "#GroupBy",
       case owners when 1 then 'Yes'
                          else 'No'
        end as SameOwner,
       case owners when 1 then 'No'
                          else 'Yes'
        end as DiffOwner
  from ServiceRequest x
  join                i   on i.IntID = x.IntID
  join                g   on g.IntID = x.IntID
                         and g.Type  = x.Type
                         and g.Area  = x.Area
  Order by x.IntID, x.RowID

2)

现在我们知道如何找到重复值,我们可以将其应用于第二个问题,使其成为一项相当简单的任务。

with i as
( select IntId,
         count(*) as tally
    from ServiceRequest
    group by IntID
    having count(*)>1
)
select x.Type, x.Area,
       count(*) as "#IntID"
  from ServiceRequest x
  join                i   on i.IntID = x.IntID
  group by Area, Type
  order by Area, Type
于 2013-11-15T00:16:29.373 回答