sql 从行开始计算分组

sql count group by from row

我有一个table

Sport    Name   gender
----------------------
tennis   John     M
football David    M
football Jane     F
football Brad     M

我想要的结果是这样的

Count Sport Gender
1      Tennis  M
0      tennis  F
2      football M
1      football F

到目前为止我能得到的是

Count Sport Gender
4      Tennis  M
4      tennis  F
4      football M
4      football F

或者我只能算网球和男一类的条件

我看过聚合函数,但我还是不会。想不出单独算的办法

这是一种方法,CROSS JOIN + LEFT OUTER JOIN + COUNT

SELECT a.sport,
       b.gender,
       Count(c.sport) AS count
FROM   (SELECT DISTINCT sport
        FROM   yourtable) a
       CROSS JOIN (SELECT 'M' AS Gender
                   UNION ALL
                   SELECT 'F') b
       LEFT OUTER JOIN yourtable c
                    ON a.sport = c.sport
                       AND b.gender = c.gender
GROUP  BY a.sport,
          b.gender 

演示:

Table 架构和数据

CREATE TABLE yourtable
  (
     Sport  VARCHAR(50),
     NAME   VARCHAR(50),
     gender CHAR(1)
  );

INSERT INTO yourtable VALUES ('tennis','John','M' );
INSERT INTO yourtable VALUES ('football','David','M' );
INSERT INTO yourtable VALUES ('football','Jane','F' );
INSERT INTO yourtable VALUES ('football','Brad','M' ); 

结果

╔══════════╦════════╦═══════╗
║  sport   ║ gender ║ count ║
╠══════════╬════════╬═══════╣
║ football ║ M      ║     2 ║
║ football ║ F      ║     1 ║
║ tennis   ║ M      ║     1 ║
║ tennis   ║ F      ║     0 ║
╚══════════╩════════╩═══════╝

这里的关键是,由于您希望能够获得 0 个计数,因此您需要 CROSS JOIN 以获得所有可能的组合,即使您的 table 中不存在任何行符合该条件(例如,没有与女性网球运动员的行)。