2

ベンダーごとにすべての重複請求書の詳細を取得するクエリを作成しようとしています。

請求書のすべての詳細が必要なため、group by を使用できません。これまでのところ、これは私が試したことです

 select 
     vendid, InvcNbr as InvcNbr, InvcDate, OrigDocAmt, PayDate,
     dense_RANK() over (partition by vendid order by invcnbr) RN
 from APDoc
 where InvcDate >= '10/01/2013'

ここから先に進む方法がわからない。

vendid   InvcNbr          InvcDate  OrigDoc   Paydate    RN
AAA  1067458361        10/2/2013     0.00   11/1/2013      8
AAA 1067461099         10/2/2013    16.08   11/1/2013      9
AAA 1067461099          10/2/2013   16.08   11/1/2013      9
AAA 1067461101          10/2/2013   16.08   11/1/2013     10
AAA 1067461101          10/2/2013   16.08   11/1/2013     10
AAA 1067461102          10/2/2013   16.08   11/1/2013     11
AAA 1067461102          10/2/2013   16.08   11/1/2013     11
AAA 1067461103          10/2/2013   92.45   11/1/2013     12
AAA 1067461103          10/2/2013   92.45   11/1/2013     12
4

4 に答える 4

0

これも機能し、理解しやすいかもしれません。

select InvcNbr, COUNT(InvcNbr) as [count]
into #temp1 
from #APDoc
group by InvcNbr

select a.vendid, a.InvcNbr, a.InvcDate, a.OrigDoc, a.Paydate, a.RN
from APDoc a, #temp1 b
where a.InvcNbr = b.InvcNbr
and b.[count] = 2
于 2013-11-07T21:48:44.717 に答える
0

テーブルに主キーがあると仮定すると、EXISTS 句を使用してこれを (潜在的に) 非常に迅速に実行できます。

select * from APDoc a1 where exists 
  (
    select 1 from APDoc a2 
    where a1.pk <> a2.pk
    and a1.vendid = a2.vendid and a1.invcnbr = a2.invcnbr
  )
and InvcDate >= '10/01/2013'
order by vendid , invcnbr

これにより、クエリ オプティマイザーは集計を必要としないプランを生成できますが、これは多くの重複がある非常に大きなテーブルではコストが高くなります。

于 2013-11-08T03:19:41.080 に答える