我需要打印出有2个奖杯的玩家,我需要总结他们所有的比赛积分。我需要使用我的数据库
1.我需要trophy_count,我可以通过这一步 - >
select surname, count(t.player_id) as trophy_count
from dbo.Players p
left join Trophies t on t.player_id=p.id
group by p.surname
所以,SQL给了我这个
2.打印所有获得的积分 - >
select name, sum(points) as points
from dbo.Players p
inner join dbo.Stats s on s.player_id=p.id
group by p.name
SQL给了我这个:
我想在一个查询中执行此操作:
select name, sum(points) as points, COUNT(t.player_id) as trophy_count
from dbo.Players p
inner join dbo.Stats s on s.player_id=p.id
inner join dbo.Trophies t on t.player_id=p.id
group by p.name
并且SQL给了我这个,SQL将x 2所有信息相乘,这是错误的
而且,在这次失败的时候,我不知道我需要写什么,对于那些有2个奖杯并总结他们的积分的精选球员。 (Lonzo球21分2trophies,Kristaps Porzingis 17分2trophies)。
答案 0 :(得分:1)
为了获得更安全的结果,请将所有当前查询包装在子查询中。
SELECT p.id, p.name, p.surname,
IFNULL(trop.trophy_count, 0),
IFNULL(pts.points, 0)
FROM dbo.Players p
LEFT JOIN
(
select p.id, count(t.player_id) as trophy_count
from dbo.Players p
left join Trophies t on t.player_id=p.id
group by p.id
) trop ON p.id = trop.id
LEFT JOIN
(
select p.id,sum(points) as points
from dbo.Players p
inner join dbo.Stats s on s.player_id = p.id
group by p.id
) pts ON p.id = pts.id
答案 1 :(得分:0)
你能检查一下:
SELECT P.name,
(SELECT CASE WHEN (SUM(S.points) IS NULL) THEN 0 ELSE SUM(S.points) END FROM Stats S WHERE S.player_id = P.id ) as points,
(SELECT COUNT(T.player_id) FROM Trophies T WHERE T.player_id = P.id ) as trophy_count
FROM Players P
我在查询中的表格前没有指定dbo.
,如果您需要,请添加&测试
答案 2 :(得分:0)
它适用于你的问题
SELECT dbo.Players.name, dbo.Players.surname, ISNULL(s.points, 0) points, ISNULL(t.trophy_count, 0) trophies_count FROM dbo.Players
LEFT JOIN (
SELECT player_id, SUM(points) points FROM dbo.Stats
GROUP BY player_id
) s ON s.player_id = dbo.Players.id
LEFT JOIN (
SELECT player_id, COUNT(*) trophy_count FROM dbo.Trophies
GROUP BY player_id
) t ON t.player_id = dbo.Players.id
WHERE t.trophy_count = 2