0

ポイントに関するイベントの記録を収集する 2 つのテーブルがあります。

CREATE TABLE report_one
(
  date timestamp,
  point_id bigint,
  income int
 )
CREATE TABLE report_two
(
  date timestamp,
  point_id bigint,
  spent int
 )

合計レポート (および追加レポート) を生成したいと考えています。ページネーション、順序付けをサポートする必要があるため、結合を使用したい...

問題は、結合キー (レポートのポイント ID) が 1:1 ではないため、同じ行を複数取得したことです。

insert into report_one values('2013-1-1',1,1)
insert into report_two values('2013-1-1',1,1)
insert into report_two values('2013-1-2',1,1)

select * from report_one r1 left join report_two r2 on r1.point_id  = r2.point_id

テーブル report_one の2行がありますが、合計で1つしか必要ありません。各行が一度だけになる、テーブル間のある種の結合のビューを作成できるようにしたいと考えています。

**次のような出力が必要です:

1 (pid) 、1,1,0,0 - report_one からの this

1 (pid) ,0,0,1,1 -- これは report_two から

1 (pid) ,0,0,1,1 -- これは report_two から **

すべてを結合することは素晴らしいことですが、2 つのテーブルに同じ列の型がありません。

追伸。実際のテーブルには多くの列があり、pk は複数の列です。質問を簡単にするだけです。

4

3 に答える 3

1

以下を試してみませんか。

CREATE TABLE report
(
  report_id bigint,
  date varchar(20),
  point_id bigint,
  amount int,
  amount_type varchar(20)
 );

それから

   insert into report values (1,'2013-01-01',1,1,'income');
   insert into report values (2,'2013-01-01',1,1,'expense');
   insert into report values (2,'2013-01-02',1,1,'expense');

ついに

SELECT report_id,amount_type,SUM(point_id) FROM report GROUP BY report_id,amount_type

出力は report/amount_type ごとに point_id を合計し、日付範囲などごとに統計を描画しやすくなり、テーブルの作成と結合によるオーバーヘッドも最小限に抑えられます。

出力: SQL Fiddle Demo

于 2013-03-03T08:13:12.023 に答える
0

最初に point_id でテーブルをグループ化し、必要なフィールドに対してより適切な集計関数を選択してから、互いに結合することができます。

select r1.point_id, r1.date, r1.income, r2.spent
from
(
   select point_id, max(date) date, sum(income) income
   from report_one
   group by point_id
) r1 
    inner join
    (
       select point_id, max(date) date, sum(spent) spent
       from report_two
       group by point_id
    ) r2 on r1.point_id = r2.point_id

また、UNION の方法:

select point_id, date, income sum, 1 is_income
   from report_one
union all
select point_id, date, spent sum, 0 is_income
       from report_two
于 2013-03-03T07:58:49.860 に答える
0

私はこれが私のために働くことができると思います:

select date d1,point_id p1,0 income ,spent spent from report_one
union ALL
select date d2,point_id p2,income,0 spent from report_two

ゼロを持っている必要はありません。列が同じタイプではない場合のデモ用に追加しました

于 2013-03-03T08:20:37.887 に答える