KON
id | name
1 alex
2 peter
3 john
票
id | amount | kon_id | package
122 13 1 234
123 12 1 234
124 20 2 NULL
125 23 2 235
126 19 1 236
我想得到一个包含金额总和的所有联系人的列表,除了票证,其中包条目为NULL。 我的问题是,由于WHERE子句,我只获得具有票证的联系人。
SELECT
kon.id,
kon.name,
SUM(ticket.amount)
FROM kon LEFT JOIN ticket ON kon.id = ticket.kon_id
WHERE ticket.package IS NOT NULL
GROUP BY kon.id
目前,输出看起来像这样
1 alex 44
2 peter 23
但它看起来应该是这样的
1 alex 44
3 john NULL
2 peter 23
我使用MySQL服务器。 有可能解决这个问题吗?
答案 0 :(得分:2)
将Where
替换为AND
SELECT
kon.id,
kon.name,
SUM(ticket.amount)
FROM kon LEFT JOIN ticket ON kon.id = ticket.kon_id AND ticket.package IS NOT NULL
GROUP BY kon.id
答案 1 :(得分:0)
检查这个。
SELECT
k.id,
k.name ,
coalesce (SUM(t.amount) ,0)
FROM kon k LEFT JOIN
( select id,amount,kon_id,package from ticket where package is not null ) t
ON k.id = t.kon_id
GROUP BY k.id, k.name
OutPut:
答案 2 :(得分:0)
Begin Tran
Create Table #Kon (id INt , name Nvarchar(255))
Insert into #Kon
Select 1,'alex' UNION ALL
Select 2,'peter' UNION ALL
Select 3,'john'
Create Table #Ticket (id int,amount int,Kon_Id Int,Package Int)
INSERT INTO #Ticket
SELECT 122,13,1,234 UNION ALL
SELECT 123,12,1,234 UNION ALL
SELECT 124,20,2,NULL UNION ALL
SELECT 125,23,2,235 UNION ALL
SELECT 126,19,1,236
SELECT K.id, Name,SUM(amount) amount
FROM #Kon k
LEFT JOIN #Ticket T ON K.id=T.Kon_Id
GROUP BY K.id,Name
RollBAck Tran
答案 3 :(得分:0)
通常," ticket.package IS NOT NULL"是错误的条件:您的查询从左连接变为内连接。如果ticket.package应该是非NULL来从金额添加,它应该不是条件,而是在SUM agregate函数内。
MS SQL的工作示例
SELECT
kon.id,
min(kon.name),
SUM(case when package is NULL then 0 else ticket.amount end)
FROM @kon kon LEFT JOIN @ticket ticket ON kon.id = ticket.kon_id
GROUP BY kon.id
Bhosale先生的答案也是对的,但对于大牌桌会有更差的表现(原因是子查询)
答案 4 :(得分:0)
以下查询返回您的预期结果
SELECT
kon.id,
kon.name,
SUM(ticket.amount) as 'amount'
FROM kon LEFT JOIN ticket ON kon.id = ticket.kon_id
GROUP BY kon.id, kon.name
附图显示结果
答案 5 :(得分:0)
我找到了解决问题的最快方法。与其他解决方案(2s - 2min)相比,它需要大约0.2s。 CAST很重要,否则双变量的总和是错误的(浮点字符串问题)。
SELECT
kon1,
kon2,
SUM(CAST(kon3 AS DECIMAL(7,2)))
FROM (
SELECT k.id kon1, k.name kon2, t.amount kon3 FROM kon as k
LEFT JOIN ticket t ON k.id = t.ticket_kon
WHERE t.package IS NOT NULL
UNION ALL
SELECT k.id kon1, k.name kon2, NULL kon3 FROM kon k WHERE) t1
GROUP BY kon1, kon2