我一直在讨论我认为简单的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
感谢阅读!
答案 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都不存在。