3

几个小时以来,我一直在思考我认为简单的 SQL SELECT 命令。我搜索了所有地方并阅读了所有与我相关的问题。我尝试了一个 SQL 命令生成器,甚至阅读并应用了完整系列的 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.amount 的相应 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

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 相加,然后将它们全部添加到一个结果集中。我用 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 回答