SQL SELECT和SUM来自三个

时间:2012-06-21 21:51:58

标签: sql vb.net

我一直在讨论我认为简单的SQL SELECT命令几个小时。我在每个地方搜索并阅读与我有关的所有问题。我尝试了一个SQL Command Builder,甚至阅读并应用了完整系列的SQL教程和手册,试图从头开始构建它,了解它(这对我来说非常重要,关于我最终必须构建的下一个命令......)

但现在我只是坚持我想要的结果,但是在分离SELECT命令时,我似乎无法聚在一起!

这是我的情况:3个表,第一个链接到第二个具有公共ID,第二个链接到第三个具有另一个公共ID,但没有从第一个到第三个的公共ID。让我们说:

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

表A中的几个名称。表B中的几个数量。表C中的几个数量。想要的结果:每个A.id和A.name,具有相应的B.amount的SUM,以及相应的C的SUM。量。让我们说:

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

“前三列”和“前两列和第四列”都可以,它们都带有WHERE子句和/或LEFT JOIN。但是我不能在不弄乱所有东西的情况下累积所有第四列!

有人可以说“这很简单,只需在表C中添加一个idA列”!应该更容易,肯定。但这真的有必要吗?我不这么认为,但我错了!所以,我只是喜欢任何人(我将给予一个永恒的“SQL神”装饰)用SQL技能回答笑“这很简单!就这样做你就走了!愚蠢的小新手......”;)

运行VB 2010和MS SQL Server

感谢阅读!

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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加起来,然后将它们全部加到一个结果集中。我在MSSQL中用一些示例数据对它进行了测试,它按预期工作。

答案 2 :(得分: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

答案 3 :(得分: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

外部联接将考虑何时b和c记录对于给定的id都不存在。