SQL查找行总和并返回键计数

时间:2019-03-03 06:36:43

标签: sql database postgresql

对于看起来像这样的数据库表:

id  | year | stint | sv
----+------+-------+---
mk1 | 2001 | 1     | 30
mk1 | 2001 | 2     | 20
ml0 | 1999 | 1     | 43
ml0 | 2000 | 1     | 44
hj2 | 1993 | 1     | 70

我想得到以下输出:

 count
-------
     3

以条件为基础,计算大于1994年的单年sv> 40的id的数量。如果同一年的停留时间超过一个,则添加sv点并查看> 40。

这是我到目前为止写的,但是显然是不对的:

SELECT COUNT(DISTINCT id),
SUM(sv) as SV
FROM public.pitching
WHERE (year > 1994 AND sv >40);

我知道语法是完全错误的,并且缺少某些条件的信息,但是我对SQL不够熟悉,并且不知道如何正确地对具有条件的同一表中的两行进行求和(也许有一个子查询?)。任何帮助,将不胜感激! (使用postgres)

2 个答案:

答案 0 :(得分:1)

您可以使用嵌套查询来获取聚合,然后将其包装以获取计数。请注意,总和的条件必须在having子句中:

SELECT COUNT(id)
FROM (
    SELECT   id,
             year,
             SUM(sv) as SV
    FROM     public.pitching
    WHERE    year > 1994
    GROUP BY id, 
             year
    HAVING   SUM(sv) > 40 ) years

如果id仅在满足条件的一年内应该只计数一次,那么请使用COUNT(distinct id)而不是COUNT(id)

答案 1 :(得分:1)

您可以尝试像使用sumpartition by year一样。

select count( distinct year) from
(
  select year, sum(sv) over (partition by year) s
  from public.pitching
  where year > 1994
) t where s>40

Online Demo