我有两张tablea和b。我的目标是列出a中的每一行,同时附上b中的“金额”之和。
这样地:
SELECT a.name,
SUM(b.amount) as amount
FROM a
LEFT JOIN b ON a.id = b.a_id
GROUP BY a.id
在此之前没有问题,但我还需要检查b表的'shop\u id'是否与某个值匹配,如果匹配,则需要该单行的'amount',而不是所有分组行的总和。我希望这是可以理解的。
Table A
id name
----------------
1 john
2 doe
3 smith
Table B
a_id amount shop
-----------------------
1 4 1
1 3 2
2 2 2
2 7 3
3 3 3
3 1 2
“shop”为1时的期望结果:
name amount shop
---------------------
john 4 1 //no SUM, only the value of amount where shop=1
doe 9 0 //sum(7,2) because shop is not 1
smith 4 0 //sum(3,1)
我在sum()选择中考虑了一个if语句类似于此,但是下面的语句返回的不是所需的groupped行值
SELECT a.name,
( CASE
WHEN b.shop <> 1 THEN Sum(b.amount)
ELSE b.amount
end ) AS amount,
( CASE
WHEN b.shop <> 1 THEN 0
ELSE b.shop
end ) AS shop
FROM a
LEFT JOIN b
ON a.id = b.a_id
GROUP BY a.id
有什么想法吗?有没有一种方法可以将这种情况应用到团队中,比如: case shop<>1 THEN .... ELSE GROUP BY a.id
??
2条答案
按热度按时间qoefvg9y1#
你需要
Left Join
两次和table在一起b
.第一个连接将允许计算和。
只有当shop=1时,第二个连接才会连接。因此,如果我们由于第二个连接得到一些非空值,我们将考虑它,否则求和
请尝试以下操作:
结果
db fiddle视图
pkbketx92#
使用所谓的条件聚合是正确的。以下是一个应该可以使用的版本:
演示