SQL如何使用收集的SUM值计算行值

问题描述 投票:2回答:2

mlb_pitchers表

+------+-----------+-----------+-----+-----+
| year | playerID  | nameLast  | IP  | ER  |
+------+-----------+-----------+-----+-----+
| 1903 | mathech01 | Mathewson | 366 |  92 |
| 1903 | youngcy01 | Young     | 341 |  79 |
| 1904 | mathech01 | Mathewson | 367 |  83 |
| 1904 | walshed01 | Walsh     | 110 |  32 |
| 1904 | youngcy01 | Young     | 380 |  83 |
| 1905 | mathech01 | Mathewson | 338 |  48 |
| 1905 | walshed01 | Walsh     | 136 |  33 |
| 1905 | youngcy01 | Young     | 320 |  65 |
| 1906 | mathech01 | Mathewson | 266 |  88 |
| 1906 | walshed01 | Walsh     | 278 |  58 |
| 1906 | youngcy01 | Young     | 287 | 102 |
+------+-----------+-----------+-----+-----+

第一件事是获得从1903年到1906年投球的每个投手的IP和ER的总和,但也必须在1903年投球。

SELECT
  playerID,
  nameLast,
  SUM(IP),
  SUM(ER)
FROM mlb_pitchers
WHERE year >= 1903
AND year <= 1906
GROUP BY playerID,
         nameLast
HAVING SUM(CASE
  WHEN year = 1903 THEN 1
  ELSE 0
END) > 0

产量

+-----------+-----------+---------+---------+
| playerID  | nameLast  | SUM(IP) | SUM(ER) |
+-----------+-----------+---------+---------+
| mathech01 | Mathewson |    1337 |     311 |
| youngcy01 | Young     |    1328 |     329 |
+-----------+-----------+---------+---------+

我想做的,无法弄清楚要添加到SQL的内容,是添加一个输出列(新行值),该列使用SUM值来计算投手的ERA。 ERA = ER / IP * 9.因此输出应如下所示:

+-----------+-----------+---------+---------+------+
| playerID  | nameLast  | SUM(IP) | SUM(ER) | ERA  |
+-----------+-----------+---------+---------+------+
| mathech01 | Mathewson |    1337 |     311 | 2.09 |
| youngcy01 | Young     |    1328 |     329 | 2.23 |
+-----------+-----------+---------+---------+------+
mysql sql
2个回答
4
投票

添加一个额外的输出列来执行ERA的计算,如下所示:

SELECT playerID, nameLast, SUM(IP), SUM(ER),  (SUM(ER) / SUM(IP)) * 9.0 as ERA
FROM mlb_pitchers 
WHERE year >= 1903 AND year <= 1906 
GROUP BY playerID, nameLast 
HAVING SUM(CASE WHEN year = 1903 THEN 1 ELSE 0 END) > 0 

2
投票
SELECT playerID, nameLast, SUM(IP), SUM(ER),
   9.0*SUM(ER)/Sum(IP) ERA,
FROM mlb_pitchers 
WHERE year >= 1903 AND year <= 1906 
GROUP BY playerID, nameLast 
HAVING SUM(CASE WHEN year = 1903 THEN 1 ELSE 0 END) > 0 
© www.soinside.com 2019 - 2024. All rights reserved.