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 がカウントされる回数 (2 回以上になる可能性があります)
  • #GroupBy: 列「Type」と「Area」の組み合わせで、重複する IntID がカウントされた回数
  • 同じ所有者; ここで、Type と Area のグループ化で、OwnerBussUnit の値は同じです
  • DiffOwner; ここで、Type と Area のグループ化で、OwnerBussUnit は同じ値を持たない 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) COUNTING THEM Type と Area でグループ化された重複する 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、グループの情報を取得する 2 番目のサブクエリを参照します。

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)

重複した値を見つける方法がわかったので、これを 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 に答える