我需要找到每个参赛者赢得的总奖金,并按照他们居住的州进行排序,并显示各州的“奖金”总额。请注意,每个彩票可以有多个获奖者,奖金在他们之间平分。
这是我到目前为止所想到的:
select State.Name, SUM(Lottery.Payout)
from State, Lottery
join Player on(Player.CountyID = County.CountyID) join County on(County.State = State) group by State.Name;
select * from State_TotalWinnings;
通过我的“解决方案”,我得到了每个州每个县递归添加的总奖金。 我一生都无法弄清楚如何阻止这个递归问题。
Innlandet|761340435
Møre og Romsdal|761340435
Nordland|761340435
Oslo|761340435
Rogaland|761340435
Viken|761340435
我的数据库设置如下:
CREATE TABLE State(
StateID char(2),
Population INT,
Name varchar(128),
PRIMARY KEY (StateID)
);
CREATE TABLE County(
CountyID char(4),
State char(2),
Population INT,
Area decimal(10,2),
Name varchar(128),
PRIMARY KEY (CountyID),
FOREIGN KEY (State) REFERENCES State (StateID)
);
CREATE TABLE Player(
PlayerNr INT,
Name varchar(128),
Address varchar(128),
CountyID char(4),
PRIMARY KEY (PlayerNr),
FOREIGN KEY (CountyID) REFERENCES County (CountyID)
);
CREATE TABLE Employee(
EmployeeID INT,
Name varchar(128),
CountyID char(4),
PRIMARY KEY (EmployeeID),
FOREIGN KEY (CountyID) REFERENCES County (CountyID)
);
CREATE TABLE Lottery(
LotteryID INT,
Date DATE,
Payout INT,
EmployeeID INT,
PRIMARY KEY (LotteryID),
FOREIGN KEY (EmployeeID) REFERENCES Employee (EmployeeID)
);
CREATE TABLE Winner(
PlayerNr INT,
LotteryID INT,
PRIMARY KEY (PlayerNr,LotteryID),
FOREIGN KEY (PlayerNr) REFERENCES Player (PlayerNr),
FOREIGN KEY (LotteryID) REFERENCES Lottery (LotteryID)
);
最佳答案
这个难题的“复杂”部分是将奖金平均分配给获胜者。我在示例中使用了 CTE(开头的“with”子句)。
with winning_payouts as (
select w.LotteryID, payout/count(*) as payout
from Lottery l
join Winner w using (LotteryID)
group by w.LotteryID
)
select s.Name, sum(payout)
from State s
join County c using (State)
join Player p using (CountyID)
join Winner w using (PlayerNr)
join winning_payouts using (LotteryID)
group by State.Name
还有许多其他不包含 CTE 的方法可以实现此目的,包括:
- 使 CTE 成为自己的独立 View ,使将来的查询变得更加容易。
- 使用子查询代替 CTE
- 使用窗口函数,例如
payout/count(*) over(按 LotteryID 分区)
关于mysql - SQL,查找按区域划分的玩家总奖金,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70262190/