3

単純な SQL SELECT コマンドだと思っていたものについて、何時間も頭を悩ませてきました。私はあらゆる場所を検索し、私に関連するすべての質問を読みました。私は SQL Command Builder を試してみましたが、完全な一連の SQL チュートリアルとマニュアルを読んで適用し、それを理解してゼロから構築しようとしました (これは、最終的に構築する必要がある次のコマンドに関して、私にとって非常に重要です...) .

しかし、今は私が望む結果に固執していますが、別々の SELECT コマンドではまとめられないようです!

これが私のケースです:3つのテーブル、最初は共通のIDで2番目にリンクされ、2番目は別の共通IDで3番目にリンクされていますが、最初から3番目までの共通IDはありません。まあ言ってみれば :

Table A : id, name
Table B : id, idA, amount
Table C : id, idB, amount

表 A にいくつかの名前。まあ言ってみれば :

A.id
A.name
SUM(B.amount) WHERE B.idA = A.id
SUM(C.amount) WHERE C.idB = B.id for each B which B.idA = A.id

「最初の 3 列」と「最初の 2 列と 4 番目の列」はどちらも WHERE 句または LEFT JOIN で問題ありません。しかし、すべてを台無しにすることなく、4 番目の列すべてを累積することはできません。

「簡単です。表 C に idA 列を入れるだけです」 ! 確かに、もっと簡単なはずです。しかし、それは本当に必要ですか?そうは思いませんが、間違っている可能性があります。ですから、SQL のスキルを持っている人なら誰でも (永遠の「SQL ゴッド」の装飾を贈ります) 笑って答えてくれます。

VB 2010 および MS SQL Server の実行

読んでくれてありがとう !

4

4 に答える 4

5

これを試して:

SELECT A.Id, A.Name, ISNULL(SUM(B.amount), 0) as bSum, ISNULL(SUM(C2.Amount), 0) as cSum
FROM A 
LEFT OUTER JOIN B ON A.Id = B.idA
LEFT OUTER JOIN (SELECT C.idB, SUM(C.AMOUNT) AS Amount FROM C GROUP BY C.idB) AS C2 ON C2.idB = B.Id
GROUP BY A.Id, A.Name
于 2012-06-21T21:55:24.383 に答える
2

これを試して:

SELECT 
    a.id, 
    a.name, 
    sum(x.amount) as amountb, 
    sum(x.amountc) as amountc 
from a 
    left join (
        select
            b.id, 
            b.ida, 
            b.amount, 
            SUM(c.amount) as amountc
        from b 
        left join c 
            on b.id = c.idb
        group by 
            b.id, 
            b.amount, 
            b.ida
    ) x 
        on a.id = x.ida
group by 
    a.id, 
    a.name

これにより、探している結果セットが得られるはずです。各 B.id のすべての C.Amount を合計し、すべてを 1 つの結果セットに追加します。MSSQL のサンプル データを少し使ってテストしたところ、期待どおりに動作しました。

于 2012-06-21T22:20:22.380 に答える
0
Select a.id, a.name, sum(b.amount), sum(c.amount)
from a inner join b on a.id = b.idA
inner join c on b.id = c.idB
group by a.id, a.name
于 2012-06-21T21:55:23.350 に答える
0

それらを個別に追加する必要があります。

select a.id, a.name, (coalesce(b.amount, 0.0) + coalesce(c.amount, 0.0))
from a left outer join
     (select b.ida, sum(amount) as amount
      from b
      group by b.ida
     ) b
     on a.id = b.ida left outer join
     (select b.ida, sum(amount) as amount
      from c join
           b
           on c.idb = b.id
      group by b.ida
     ) c
     on a.id = c.ida

外部結合は、特定の ID に対して b レコードと c レコードの両方が存在しない場合に考慮されます。

于 2012-06-21T21:55:36.280 に答える