sqlite - 无法在 SQLite 中使用简单的除法选择语句
问题描述
我有以下代码
SELECT DISTINCT M.First_Name || ' ' || M.Surname AS Manager,
SUM(CASE WHEN MC.Team = F.Home_Team AND
MC.Start_Date <= F.Date AND
MC.End_Date >= F.Date THEN 1 WHEN MC.Team = F.Away_Team AND
MC.Start_Date <= F.Date AND
MC.End_Date >= F.Date THEN 1 ELSE 0 END) AS Games,
SUM(CASE WHEN S.HTFT > S.ATFT AND
F.Home_Team = 48 AND
MC.Start_Date <= F.Date AND
MC.End_Date >= F.Date THEN 3 WHEN S.ATFT > S.HTFT AND
F.Away_Team = 48 AND
MC.Start_Date <= F.Date AND
MC.End_Date >= F.Date THEN 3 WHEN S.HTFT = S.ATFT AND
MC.Start_Date <= F.Date AND
MC.End_Date >= F.Date THEN 1 ELSE 0 END) AS Points,
(SUM(1.0 * CASE WHEN S.HTFT > S.ATFT AND
F.Home_Team = 48 AND
MC.Start_Date <= F.Date AND
MC.End_Date >= F.Date THEN 3 WHEN S.ATFT > S.HTFT AND
F.Away_Team = 48 AND
MC.Start_Date <= F.Date AND
MC.End_Date >= F.Date THEN 3 WHEN S.HTFT = S.ATFT AND
MC.Start_Date <= F.Date AND
MC.End_Date >= F.Date THEN 1 ELSE 0 END) / SUM(CASE WHEN MC.Team = F.Home_Team AND
MC.Start_Date <= F.Date AND
MC.End_Date >= F.Date THEN 1 WHEN MC.Team = F.Away_Team AND
MC.Start_Date <= F.Date AND
MC.End_Date >= F.Date THEN 1 ELSE 0 END) ) AS PPG
FROM Manager AS M
LEFT JOIN
Manager_Contract AS MC ON M.ID = MC.Manager
LEFT JOIN
Fixture AS F ON MC.Team = F.Home_Team OR
MC.Team = F.Away_Team
LEFT JOIN
Score AS S ON F.ID = S.Fixture
GROUP BY M.First_Name || ' ' || M.Surname
HAVING Games > 0
ORDER BY MC.Start_Date ASC;
哪个返回
经理 | 游戏 | 积分 | PPG |
---|---|---|---|
本加纳 | 10 | 12 | 1.2 |
保罗·提斯代尔 | 15 | 12 | 0.8 |
汤米·威德灵顿 | 3 | 3 | 1 |
乔伊·巴顿 | 18 | 11 | 0.61111 |
我要返回的最后一列
PPG |
---|
1.20 |
0.80 |
1.00 |
0.61 |
每次我尝试在其中添加 ROUND 时都会收到一条错误消息 - 通常 Row 值被滥用。
任何帮助表示赞赏。
我正在使用 SQLite Studio 和 MacBook Pro。
问题已编辑 - 设法解决最初的问题。
解决方案
错误信息:
行值被滥用
通常是括号使用不正确的结果,这可能是因为您的代码在CASE
表达式的所有分支中都包含许多条件。
我认为您可以简化代码。
HAVING
子句中的条件:
HAVING Games > 0
将过滤掉具有此CASE
表达式的任何管理器:
CASE
WHEN MC.Team = F.Home_Team
AND MC.Start_Date <= F.Date
AND MC.End_Date >= F.Date THEN 1
WHEN MC.Team = F.Away_Team
AND MC.Start_Date <= F.Date
AND MC.End_Date >= F.Date THEN 1
ELSE 0
END
总是0
。
那么,为什么不设置一个WHERE
子句,相当于上面的条件呢?此外,这使得前 2 个LEFT
连接实际上是INNER
连接(我不确定最后一个连接是否应该是一个LEFT
连接)。
试试这个简化的代码:
SELECT M.First_Name || ' ' || M.Surname AS Manager,
COUNT(*) AS Games,
SUM(
CASE
WHEN (S.HTFT > S.ATFT AND F.Home_Team = 48) OR (S.ATFT > S.HTFT AND F.Away_Team = 48) THEN 3
WHEN S.HTFT = S.ATFT THEN 1
ELSE 0
END
) AS Points,
ROUND(
1.0 *
SUM(
CASE
WHEN (S.HTFT > S.ATFT AND F.Home_Team = 48) OR (S.ATFT > S.HTFT AND F.Away_Team = 48) THEN 3
WHEN S.HTFT = S.ATFT THEN 1
ELSE 0
END
) /
COUNT(*)
, 2
) AS PPG
FROM Manager AS M
INNER JOIN manager_Contract AS MC ON M.ID = MC.Manager
INNER JOIN Fixture AS F ON MC.Team IN (F.Home_Team, F.Away_Team)
LEFT JOIN Score AS S ON F.ID = S.Fixture
WHERE MC.Start_Date <= F.Date AND MC.End_Date >= F.Date
GROUP BY Manager;
推荐阅读
- flutter - 如果我更改第一个下拉值,如何重置第二个下拉列表?
- amazon-aurora - 调整 AWS Aurora 数据库参数以进行并行执行
- azure - Azure 数据工厂集成运行时进入受限状态
- angular - 如何将 firebase/angularfire 与 Nx 集成
- apriori - Apriori 算法 - 在生产数据中寻找关联
- multithreading - Spring Boot 在一个 ItemWriter 中使用多个线程
- python - SGD sklearn导数不为零?
- python - 简单的盒子游戏不移动蟒蛇
- javascript - Reactjs 使用 useState 导致 axios 请求循环
- react-native - 带有样式组件的 Nextjs 不通过主题