我真的很挣SQL,只是来自基于C语言的我感觉非常陌生。
我有两个SQL表。一个被称为'人',并为IDNumber INT, FirstName VARCHAR, LastName VARCHAR
保留字段。另一个被称为“捐赠”,并有IDNumber INT and DollarsRaised INT
的字段。捐赠IDNumber字段使用外键关系链接到人IDNumber。
我正在尝试加入表格并使用MIN / MAX来显示已经筹集了最多和最少美元的成员,但是我的教科书选择使用命令中有一些严重过剩的示例,所以我不能打破下来的语法。这是我得到的最接近的:
SELECT CONCAT(firstname, ' ', lastname) AS Name,
MAX(DollarsRaised) AS 'Highest Earner'
FROM donations
JOIN person USING(IDNumber);
执行此操作时,它每次都会从人员表中的第一个条目返回名称,而不是实际拉出具有最低价值的人。如果我使用MIN功能也是如此。我假设我需要一个GROUP BY语句或类似的东西,但我不确定如何正确应用它。
答案 0 :(得分:0)
我不确定这种关系是否为1:M,你需要总数。这是一个查询的查询:
select *
from
person p inner join
(select IDNumber, sum(DollarsRaised) as TotalDollarsRaised from donations) d
on d.IDNumber = p.IDNumber
如果你真的只需要顶部,这里是旧的标准SQL方法。请注意,由于关系,它可以返回多行:
select * from person p inner join donations d on d.IDNumber = p.IDNumber
where DollarsRaised = (select max(DollarsRaised) from donations)
将min和max结合在一起的方法是使用union:
select * from person p inner join donations d on d.IDNumber = p.IDNumber
where DollarsRaised = (select max(DollarsRaised) from donations)
union
select * from person p inner join donations d on d.IDNumber = p.IDNumber
where DollarsRaised = (select min(DollarsRaised) from donations)
order by DollarsRaised;
假设联盟(没有all
)实际上存在最小和最大关系将删除重复的行。
显示错误名称时遇到的问题是MySQL奇怪,允许您引用非聚合列,您不应该这样做。许多其他平台都会给你一个错误。
答案 1 :(得分:0)
SELECT firstname + ' ' + lastname AS Name,
MAX(DollarsRaised) AS 'Highest Earner'
FROM donations as d
INNER JOIN persons as p on p.IDNumber = d.IDNumber
GROUP BY firstname + ' ' + lastname
ORDER BY MAX(DollarsRaised) DESC
答案 2 :(得分:0)
我认为捐款表中每人可以捐赠多个,这意味着您首先需要为每个人捐款,然后向最高金额的人显示。以下内容适用于此:
SELECT p.IDNumber, p.FirstName, p.LastName,
SUM(d.DollarsRaised) AS DollarsRaised
FROM person p
INNER JOIN donations d
ON p.IDNumber = d.IDNumber
GROUP BY p.IDNumber, p.FirstName, p.LastName
ORDER BY DollarsRaised DESC
LIMIT 1