4

私はSQLにあまり詳しくありません。私はオラクルを使用しています。合計フィールドが多いという質問に出会いました。

以下にテーブルの例を示します。

A:
    A_ID
    A_NAME

B:
    B_ID
    A_ID
    B_NAME
    B_QTY
C:
    C_ID
    B_ID
    C_QTY

したがって、データ構造は A -> *B -> *C のようになります

B_NAME と A_ID でグループ化された B と C の合計量を取得する必要があります。例えば:

A:
    A_ID    A_NAME
    1       A1
B:
    B_ID    A_ID    B_NAME  B_QTY
    1       1       B1  20
    2       1       B1  5
    3       1       B1  5
    4       1       B2  5
C:
    C_ID    B_ID    C_QTY
    1       1       3
    2       1       4
    4       2       2
    5       2       1
    6       3       1
    7       4       1

期待される結果は次のとおりです。

A_ID    A_NAME  B_NAME  B_QTY   C_QTY
1       A1      B1      30      11
1       A1      B2      5       1

1 行目の B_QTY の 30 は、20 + 5 + 5 の結果です。

1 行目の C_QTY の 11 は、3 + 4 + 2 + 1 + 1 の結果です。

ここに私のSQLがあります:

select a.A_ID,
    a.A_NAME,
    b.B_NAME
    sum(b.B_QTY),
    sum(c.C_QTY)
from A a left outer join B b on b.A_ID = a.A_ID
left outer join C c on c.B_ID = b.B_ID
group by a.A_ID
order by a.A_ID, b.B_NAME
    where a.XXXX = XXXXX;

問題は次のとおりです。

B は複数の C にマップされるため、B_QTY は複数回合計されます。私は SQL にあまり詳しくないので、いくつかのフィールド (私の例では B_ID) に基づいて合計を区別する簡単な方法があるかどうかわかりません。ありがとうございました!

4

3 に答える 3

2

これは、次のようにして行うこともできます。

WITH b2 AS
(SELECT b.*, sum(b.b_qty) over (partition BY b.a_id, b.b_name) b_qty_s
             FROM b)
SELECT a.a_id, a.a_name, b2.b_name, b2.b_qty_s, sum(c.c_qty) c_qty_s
FROM a JOIN b2 ON a.a_id = b2.a_id
JOIN c ON b2.b_id = c.b_id
GROUP BY a.a_id,a.a_name, b2.b_name, b2.b_qty_s

ここにsqlfiddleのデモがあります

于 2013-04-08T04:49:55.123 に答える
1

次のようにすることもできます。

SELECT DISTINCT A_ID,A_NAME,B_NAME,B_SUM,SUM(C_QTY) OVER(PARTITION BY A_NAME,B_NAME) C_SUM
FROM (
SELECT A.A_ID,A_NAME,B_NAME,B_ID,SUM(B_QTY) OVER(PARTITION BY A_NAME,B_NAME) B_SUM
FROM A JOIN B
ON A.A_ID=B.A_ID) T1 
JOIN C
ON T1.B_ID=C.B_ID

ここに画像の説明を入力

于 2013-04-08T05:41:59.677 に答える
1

この問題のために SQL フィドルを作成しました。トリックは、B_QTY が結果に複数回表示されていたことです。それを合計すると、人為的に高い値を与えていました。代わりに、sub select を実行して、B_NAME を 1 回だけ使用してください。素晴らしい質問です。:^D

ABCAD の回答はクールですが、このソリューションは多くのデータベースで機能します。以前、SQL Server、Oracle、および Informix でこの手法を使用したことがあります。

データ/スキーマ:

create table a (A_ID int, A_NAME char(10));
create table b (B_ID int, A_ID int, B_NAME char(10), B_QTY int);
create table c (C_ID int, B_ID int, C_QTY int);
-- One dude
insert into a values (1,'Xiezi');
-- 2 orders? of 4 and 3
insert into b values (1,1,'B1',20);
insert into b values (2,1,'B1',5);
insert into b values (3,1,'B1',5);
insert into b values (4,1,'B2',5);
-- 2 order with 2 lines each.
insert into c values (1,1,3);
insert into c values (2,1,4);
insert into c values (4,2,2);
insert into c values (5,2,1);
insert into c values (6,3,1);
insert into c values (7,4,1);

SQL (答え):

select a.A_ID,
    a.A_NAME,
    b.B_NAME,
    (select sum(b2.B_QTY) from b b2 where b2.B_NAME = b.B_NAME)
    as sum_b_qty,
    sum(c.C_QTY)
from a left outer join b on b.A_ID = a.A_ID
left outer join c on c.B_ID = b.B_ID
group by a.A_ID,
    a.A_NAME,
    b.B_NAME
order by a.A_ID
;

出力:

A_ID A_NAME B_NAME  SUM_B_QTY SUM(C.C_QTY)
1    Xiezi  B1      30        11
1    Xiezi  B2      5         1
于 2013-04-08T02:35:46.490 に答える