SQL如何在使用SUM时排除记录

SQL如何在使用SUM时排除记录,sql,Sql,我有以下“mlb_投手”表: 执行此操作时: SELECT playerID, nameLast, SUM(IP), SUM(WAR) FROM mlb_pitchers WHERE year >= '1903' AND year <= '1906' GROUP BY playerID, nameLast 如果一个投手在任何一个年份(1903-1906)投球,这都是非常有效的。但我想排除一个在第一个搜索年度(1903年)没有记录的投手。因此,输出如下所示(不包括沃尔什): 我希望只

我有以下“mlb_投手”表:

执行此操作时:

SELECT playerID, nameLast, SUM(IP), SUM(WAR)
FROM mlb_pitchers
WHERE year >= '1903' AND year <= '1906'
GROUP BY playerID, nameLast
如果一个投手在任何一个年份(1903-1906)投球,这都是非常有效的。但我想排除一个在第一个搜索年度(1903年)没有记录的投手。因此,输出如下所示(不包括沃尔什):

我希望只包括那些有1903年记录的投手。或者相反——排除那些没有1903年记录的人。 我还没有弄清楚要向SELECT查询添加什么来完成这项任务。这可能吗?

大概,“年”是一个整数,所以不要使用引号

如果您想要记录中有1903的玩家,可以使用
having

SELECT playerID, nameLast, SUM(IP), SUM(WAR)
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(WAR)
来自大联盟投手
其中年份>=1903和年份0;
大概,“年”是一个整数,所以不要使用引号

如果您想要记录中有1903的玩家,可以使用
having

SELECT playerID, nameLast, SUM(IP), SUM(WAR)
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(WAR)
来自大联盟投手
其中年份>=1903和年份0;

如果您只想包括一系列年份,您可以添加到where子句中,但如果我知道您不想筛选年份,而是要筛选玩家

SELECT playerID, nameLast, SUM(IP), SUM(WAR)
FROM mlb_pitchers
WHERE playerID In (Select PlayerId from mlb_pitchers where year = '1903')
GROUP BY playerID, nameLast

这提供了所有年份的统计数据,但只包括1903年记录的球员。

如果你只想包括一系列年份,你可以添加到where子句中,但如果我知道你不想过滤年份,而是要过滤球员

SELECT playerID, nameLast, SUM(IP), SUM(WAR)
FROM mlb_pitchers
WHERE playerID In (Select PlayerId from mlb_pitchers where year = '1903')
GROUP BY playerID, nameLast

这提供了所有年份的统计数据,但只包括1903年记录的玩家。

Gordon Linoff,世界上有没有你无法解决的查询?Gordon Linoff,世界上有没有你无法解决的查询?有47K条记录,此解决方案扫描了所有记录,而不仅仅是1903-1906年的记录。所以它一直在运行。抱歉,您可以轻松地将年份添加回。在where子句而不是having子句中执行此操作将在聚合之前消除记录,因此在较大的表中执行此操作将对性能产生重大影响。根据你的建议,我在WHERE中添加了年份,但这仍然需要很长时间。您的SQL代码建议是什么。有47K条记录,此解决方案扫描了所有记录,而不仅仅是1903-1906条记录。所以它一直在运行。抱歉,您可以轻松地将年份添加回。在where子句而不是having子句中执行此操作将在聚合之前消除记录,因此在较大的表中执行此操作将对性能产生重大影响。根据你的建议,我在WHERE中添加了年份,但这仍然需要很长时间。您的SQL代码建议是什么。
SELECT playerID, nameLast, SUM(IP), SUM(WAR)
FROM mlb_pitchers
WHERE playerID In (Select PlayerId from mlb_pitchers where year = '1903')
GROUP BY playerID, nameLast