1

次のようなレポートを作成する必要があります。

ここに画像の説明を入力してください

エージェント、販売、支払いの3つのテーブルがあります。販売と支払いは、エージェントテーブルを介してリンクされています。レポートには、エージェントごとの1日あたりの合計1日あたりの売上が表示されます。また、エージェントが行った支払いを毎日表示する必要があります。これは、エージェントがビジネスに債務を負っているのか、またはその逆であるかをいつでも判断できるように、総売上残高から差し引かれます。

私がこれに取り組むことを計画している方法は次のとおりです。

  • 1日あたりのエージェントごとのすべての売上を取得します(1つのクエリ)
  • 1日あたりのエージェントごとのすべての支払いを取得します(1つのクエリ)
  • 各セールス、エージェント、および毎日のチェック(エージェントごとの1日あたりのエージェントの支払い)(ループ)
  • 一致するものが見つかった場合は、値を取得し、累積合計で計算に使用します
  • それ以外の場合は、累積合計のみで適切な販売データを表示します。

私の生活を少し楽にすることができるクエリがあるかどうかはわかりません。ありがとう。

[編集]

エージェントテーブル: id、name、opening_balance

販売テーブル: id、agent_id、amount、customer_id、sale_date

支払いテーブル: id、agent_id、amount、bank_id、payment_date、status

[2回目の編集]

OlafDietscheに感謝します。副選択のない2番目のクエリは、実行に長い時間がかかりました。約88秒。また、サブセレクトで最初に試してみたところ、あっという間に完了しましたが、sum(s.amount)とsum(p.amount)は本来の2倍の値を保持しています。

ここに画像の説明を入力してください

[3回目の編集]

エージェントは複数の販売を行うことができ、エージェントは複数の支払いを行うことができます

販売と支払いの間に直接の関係はありません

4

1 に答える 1

0

最初のカットはこちら

select a.name, s.sale_date, sum(s.amount), sum(p.amount),
       (select sum(amount)
        from sales
        where agent_id = a.id and sale_date <= s.sale_date) as cum_sales,
       (select sum(amount)
        from payments
        where agent_id = a.id and payment_date <= s.sale_date) as cum_payments
from agents a
join sales s on s.agent_id = a.id
join payments p on p.agent_id = a.id
group by s.agent_id, s.sale_date
order by s.agent_id, s.sale_date

累積残高は になりますopening_balance - cum_sales + cum_payments

SQL フィドル

これは、サブセレクトなしのセレクトです。これはもっと速いかもしれません

select a.name, s.sale_date, sum(s.amount), sum(p.amount),
       sum(cs.amount) as cum_sales,
       sum(cp.amount) as cum_payments
from agents a
join sales s on s.agent_id = a.id
join payments p on p.agent_id = a.id
join sales cs on cs.agent_id = a.id and cs.sale_date <= s.sale_date
join payments cp on cp.agent_id = a.id and cp.payment_date <= s.sale_date
group by s.agent_id, s.sale_date
order by s.agent_id, s.sale_date

SQL フィドル

私はそうするためのデータを持っていないので、両方ともテストされていません。

于 2012-12-10T16:35:46.997 に答える