Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在同一个表中计算两个独立的列,并将它们相加到一个新列中_Sql_Postgresql_Join_Count_Subquery - Fatal编程技术网

Sql 如何在同一个表中计算两个独立的列,并将它们相加到一个新列中

Sql 如何在同一个表中计算两个独立的列,并将它们相加到一个新列中,sql,postgresql,join,count,subquery,Sql,Postgresql,Join,Count,Subquery,我有两张桌子:playernames和matches SELECT * FROM playernames; id | name ----+------------------ 38 | Abe Lincoln 39 | Richard Nixon 40 | Ronald Reagan (3 rows) SELECT * FROM matches; match_id | winner | loser ----------+--------+-------

我有两张桌子:playernamesmatches

SELECT * FROM playernames;
 id |       name       
----+------------------
 38 | Abe Lincoln
 39 | Richard Nixon
 40 | Ronald Reagan
(3 rows)

SELECT * FROM matches;
 match_id | winner | loser 
----------+--------+-------
        6 |     38 |    39
        8 |     38 |    39
        9 |     39 |    38
       10 |     38 |    39
       11 |     40 |    39
(5 rows)
我需要创建一个返回四列的查询:id、name、wins、matches。但即使使用连接和子查询,我似乎也无法在一个查询中获得所有信息。我最接近的方法是执行两个单独的查询。这是用于计算每位玩家的总胜利数的查询:

SELECT playernames.id, name, COUNT(*) AS wins 
FROM matches, playernames 
WHERE winner = playernames.id 
GROUP BY playernames.id, winner;
 id |       name       | wins 
----+------------------+------
 38 | Abe Lincoln      |    3
 39 | Richard Nixon    |    1
 40 | Ronald Reagan    |    1
(3 rows)
但如果我想正确计算每个球员的总比赛次数,我必须发出一个单独的查询:

SELECT playernames.id, name, COUNT(*) 
FROM matches, playernames 
WHERE playernames.id = winner 
OR playernames.id = loser 
GROUP BY playernames.id;
 id |       name       | count 
----+------------------+-------
 40 | Ronald Reagan    |     1
 38 | Abe Lincoln      |     4
 39 | Richard Nixon    |     5
(3 rows)

我尽量避免把这个问题弄得乱七八糟,因为我曾多次尝试将这些错误组合到一个查询中。有人能告诉我如何将这两个查询正确地组合成一个查询吗?

我会使用一个连接来获取一名球员参与的所有比赛,然后计算一个
案例
表达式以仅提取他赢得的比赛:

SELECT    playernames.id, name, 
          COUNT(CASE playernames.id WHEN winner THEN 1 ELSE NULL END) AS wins, 
          COUNT(match_id) AS matches
FROM      playernames 
LEFT JOIN matches ON playernames.id IN (winner, loser)
GROUP BY  playernames.id, name;

只是一个注释,为什么不将TablePlayerNames重命名为Just players呢?请参见下文,postgresql没有NVL函数。果然是这样。谢谢有趣的是,您的解决方案包含了我正在学习的课程中未涉及的元素。但我无法与讲师或助教协商,因为他们的论坛在另行通知之前处于离线状态。现在我怀疑这是否可以通过课堂上教授的简单连接和子查询来解决。我无法从postgresql文档中找到答案。事实上,我刚刚添加了一个匹配项为0的玩家,您是对的,他没有出现在输出中。我不知道这是Mureinik提出的查询问题还是我的模式问题。匹配项为0的玩家在匹配项表中没有任何行,只有playernames表中的一行。@LukeSheppard确实,查询没有处理没有匹配项的玩家。使用
左连接
,就像Pavel建议的那样,处理它们。是的。
左连接成功了。再次感谢。