0

ここに私が持っているテーブルがあります:

AB タプル テーブル A.id、B.id、C.units のエントリを持つ C テーブル C.id のエントリを持つ D テーブル 同じ A を持つ C.id を持つ D テーブルのすべてのエントリをカウントしたい.id と B.id を取得し、同じ A.id と B.id を持つすべての C.units の合計からその数を減算して、新しい列「差分」として表示します。

したがって、クエリで「違い」、共通の A.id および共通の B.id を 1 行で返すようにしたい

カウントが 0 で、「差」が sum(C.units) と等しい場合にもエントリを返す必要があります。

例えば

D table

D.id = 1, open=true, D.CID = 2
D.id = 2, open=true, D.CID = 3
D.id = 3, open=true, D.CID = 3
D.id = 4, open=true, D.CID = 4

C table

C.id = 2, A.id = 3, B.id = 5, units =4 
C.id = 3, A.id = 3, B.id = 5, units = 6
C.id = 4, A.id = 4, B.id = 6, units = 8
C.id = 5, A.id = 4, B.id = 6, units = 10

Bc D の最初の 3 つのエントリには、同じエントリでカウントされる同じ AID と BID を持つ CID があります。また、同じ A.id と B.id を持つ C エントリの単位は合計されます。C エントリに関連する D エントリがない場合でも。したがって、クエリは次の 2 つのエントリを返す必要があります。

1. difference = (6+4)-3 = 7    A.id = 3  B.id = 5
2. difference = (10+8)-1 = 17  A.id = 4  B.id = 6
4

1 に答える 1

1

セットアップ(実際に質問に含める必要があります):

CREATE TABLE c
  (
    id int NOT NULL PRIMARY KEY,
    aid int NOT NULL,
    bid int NOT NULL,
    units int NOT NULL
  );
CREATE TABLE d
  (
    id int NOT NULL PRIMARY KEY,
    open boolean NOT NULL,
    cid int NOT NULL
  );
INSERT INTO c VALUES (2,3,5,4),(3,3,5,6),(4,4,6,8),(5,4,6,10),(6,7,8,9);
INSERT INTO d VALUES (1,true,2),(2,true,3),(3,true,3),(4,true,4);

質問を理解するのは少し難しいですが、私はあなたがこのようなものを探しているかもしれないと思います:

WITH n AS (
  SELECT aid, bid, count(*) AS cnt
    from c
    JOIN d ON (d.cid = c.id)
    GROUP BY aid, bid
)
SELECT aid, bid, sum(c.units) - COALESCE(n.cnt, 0) AS difference
  FROM c
  LEFT JOIN n USING (aid, bid)
  GROUP BY aid, bid, n.cnt
  ORDER BY aid, bid;

私はこれらの結果を得る:

援助| 入札| 違い
----- + ----- + ------------
   3 | 5 | 7
   4 | 6 | 17
   7 | 8 | 9
(3行)
于 2012-09-13T17:07:18.983 に答える