【问题标题】:how to Subtract 2 Columns in SQLite?如何在 SQLite 中减去 2 列?
【发布时间】:2018-02-14 23:09:37
【问题描述】:

如果给定表格:

games_played(ID,home_team,away_team,homescore,awayscore)

输入:

('1', 'USA', 'CAN', '0','2')

('2', 'USA', 'CAN', '1','2')

('3', 'USA', 'CAN', '3','0')

('4', 'SWE', 'CAN', '3','2')

('5', 'CAN', 'RUS', '3','2')

('6', 'DE', 'RUS', '0','2')

输出应该是团队:SWE、CAN

我会怎么做才能找到主场胜负多的球队?我试过这样做:

select home_team, count(*)
  from games_played
  where homescore > awayscore
  group by home_team

-

select home_team, count(*)
  from games_played
  where awayscore > homescore
  group by home_team

第一个查询应该返回球队名称和他们在主场赢得的比赛场数。第二个应该是他们在主场输掉的比赛场数。此查询不起作用,我正在寻找另一种方法。我知道我不能在 'where' 中使用 count

【问题讨论】:

  • 好的,我已经编辑了输入和输出。

标签: sql sqlite


【解决方案1】:

使用条件聚合:

SELECT home_team,
COUNT(CASE WHEN homescore > awayscore THEN 1 END) AS gamesWon,
COUNT(CASE WHEN awayscore > homescore THEN 1 END) AS gamesLost
FROM games_played
GROUP BY home_team

结果


现在只返回将gamesWon > gamesLost 放入common table expression 的团队:

WITH cte AS (
SELECT home_team,
COUNT(CASE WHEN homescore > awayscore THEN 1 END) AS gamesWon,
COUNT(CASE WHEN awayscore > homescore THEN 1 END) AS gamesLost
FROM games_played
GROUP BY home_team)

SELECT * FROM cte
WHERE gamesWon > gamesLost

结果


复制

[DEMO HERE]

CREATE TABLE games_played (ID INT,home_team VARCHAR(20),away_team VARCHAR(20),homescore INT,awayscore INT);

/* Create few records in this table */
INSERT INTO games_played VALUES(1,'USA','CAN',0,2);
INSERT INTO games_played VALUES(2,'USA','CAN',1,2);
INSERT INTO games_played VALUES(3,'USA','CAN',3,0);
INSERT INTO games_played VALUES(4,'SWE','CAN',3,2);
INSERT INTO games_played VALUES(5,'CAN','RUS',3,2);
INSERT INTO games_played VALUES(6,'DE','RUS',0,2);


/* Verify */
-- SELECT * FROM games_played;

WITH cte AS (
SELECT home_team,
COUNT(CASE WHEN homescore > awayscore THEN 1 END) AS gamesWon,
COUNT(CASE WHEN awayscore > homescore THEN 1 END) AS gamesLost
FROM games_played
GROUP BY home_team)

SELECT * FROM cte
WHERE gamesWon > gamesLost

【讨论】:

  • 我将如何进一步使用它来隔离 CAN 和 SWE 国家,因为它们是仅有的 2 个主场赢比输多的国家?而不是输出所有主场胜负的计数。我想我需要在 home_win > home_loss 时创建视图并输出?有没有办法不使用创建视图
  • @s878 是的,请查看我的最终编辑以及解释和演示。
【解决方案2】:

这是一个更简单的方法,

SELECT g.home_team AS Team
FROM games_played g
LEFT JOIN games_played Win ON Win.id = g.id AND Win.homescore > Win.awayscore
LEFT JOIN games_played Lost ON Lost.id = g.id AND Lost.homescore < Lost.awayscore
GROUP BY g.home_team
HAVING
COUNT(Win.home_team) > COUNT(Lost.home_team)

【讨论】:

  • 这不会只为这种情况输出正确答案,但如果有一个实例,例如我们有 (1,'USA','CAN',3,2) 那么它不会'行不通,因为美国会输掉 1 场主场比赛,但主场比赛赢得的比赛数将超过输球,应该输出。
猜你喜欢
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
相关资源
最近更新 更多