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 中不存在任何行符合该条件(例如,没有与女性网球运动员的行)。
我有一个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 中不存在任何行符合该条件(例如,没有与女性网球运动员的行)。