mysql - SQL,查找按区域划分的玩家总奖金

标签 mysql sql

我需要找到每个参赛者赢得的总奖金,并按照他们居住的州进行排序,并显示各州的“奖金”总额。请注意,每个彩票可以有多个获奖者,奖金在他们之间平分。

这是我到目前为止所想到的:

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/

相关文章:

mysql排序字段增量值

相同类型的 Java 泛型约束

python - Django 说 MySQL 不允许唯一的 CharFields 有一个 max_length > 255,但它允许

mysql - 查询需要很长时间才能执行

mysql - 在 MySQL 8 中按类别显示前 N 行,而在另一个类别中不重复

sql - 显示最高工资持有者的姓名(不使用子查询)

mysql - 基于附加列强制执行外键约束

sql - 有 INNER JOIN 限制吗?

mysql - 获取组内最新记录

MySQL 错误检查显示误报