4

これは単純な問題であり、ここで可能かどうかはわかりません。問題は次のとおりです。

=> http://sqlfiddle.com/#!12/584f1/7

説明:

  • チケットは出席者のものです
  • 出席者には収益があります
  • チケットをセクションごとにグループ化し、総収入を得る必要があります。
  • これは、2 枚のチケットが同じ出席者に属する可能性があるため、出席者が二重にカウントされ、二重にカウントされます。収益の合計を取得したいのですが、出席者を 1 回だけカウントします。

私のsqlfiddleの例では、次のことを確認したいと思います:

section | total_revenue
------------------------
A       | 40            <= 40 is correct, but I'm getting 50...
B       | null
C       | 40

サブクエリを使用せずにこれを解決したいと思います。単一のクエリで異なる結合の複数の列に対してこれを実行できるスケーラブルなソリューションが必要です。したがって、これを達成できるものは何でも、私は提案を受け入れます。

ご協力いただきありがとうございます。

4

3 に答える 3

1

繰り返しますが、サブクエリなし:

重要な要素は、ウィンドウ関数に追加PARTITION BYすることです:

SELECT DISTINCT
       t.section
--    ,sum(count(*))       OVER (PARTITION BY t.section) AS tickets_count
      ,sum(min(a.revenue)) OVER (PARTITION BY t.section) AS atendees_revenue
FROM   tickets t
LEFT   JOIN attendees a ON a.id = t.attendee_id
GROUP  BY t.attendee_id, t.section
ORDER  BY t.section;

-> sqlfiddle

ここではGROUP BY t.attendee_id, t.section、ウィンドウ関数を介して結果を実行する前に、. PARTITION BY t.section今回は結果をセクションごとに分割したいので、ウィンドウ関数で使用します。

チケットの数も取得したい場合は、2 行目のコメントを外します。

それ以外の場合は、前の質問に対する私の回答と同様に機能します。つまり、残りの説明が適用されます。

于 2012-11-01T22:24:26.883 に答える
1

を使用したバージョンは次のrow_number()とおりです。

select section,
  sum(revenue) Total
from 
(
  select t.section, a.revenue,
    row_number() over(partition by a.id, t.section order by a.id) rn
  from tickets t
  left join attendees a
    on t.attendee_id = a.id
) src
where rn = 1
group by section
order by section;

デモで SQL Fiddle を参照してください

于 2012-11-01T19:23:42.343 に答える
0

あなたはこれを行うことができます:

select t.section, sum(d.revenue)
from 
(
  SELECT DISTINCT section, attendee_id FROM tickets
) t
left join attendees d on t.attendee_id = d.id
group by t.section
order by t.section;
于 2012-11-01T19:20:43.160 に答える