按年龄分组和计数
Group and count by age breaks
对于航行(年、船),我如何在标准 SQL 或 MS-ACCESS 中按年龄间隔对水手进行分组和计数?
YEAR SHIP SAILOR_AGE
2003 Flying dolphin 33
2003 Flying dolphin 33
2003 Flying dolphin 34
2001 Flying dolphin 23
2003 Flying dolphin 35
2001 Flying dolphin 38
2001 Flying dolphin 31
2003 Flying dolphin 36
2003 Columbine 41
2003 Columbine 42
2003 Flying dolphin 27
2003 Flying dolphin 51
2003 Flying dolphin 46
我尝试了什么:
SELECT YEAR, SHIP, SAILOR_AGE, COUNT (*) as `NUMBERS`
FROM TABLE
GROUP BY YEARS, SHIP, SAILOR_AGE;
它给我每年的水手人数:
示例:
YEAR |SHIP |SAILOR_AGE | NUMBERS
------------------------------------------
2003 | Flying dolphin| 33 | 2
如何按区间对水手年龄进行分组
示例:
From 20th to 40th year's old
From 40th to 60th year's old
您可以尝试使用 CASE
来指定以下年龄范围:
SELECT YEARS, SHIP, AgeRange, COUNT (*) as `NUMBERS`
FROM (SELECT YEAR
, SHIP
, CASE WHEN SAILOR_AGE BETWEEN 21 AND 40 THEN '21-40'
WHEN SAILOR_AGE BETWEEN 41 AND 60 THEN '41-60'
ELSE 'XX-XX' -- anything goes here
END as AgeRange
FROM YourTable
)x
GROUP BY YEARS, SHIP, AgeRange;
如果你想要列中的值,你可以使用条件聚合:
SELECT YEAR, SHIP, COUNT(*) as NUMSAILORS,
SUM(CASE WHEN SAILOR_AGE BETWEEN 21 AND 40 THEN 1 ELSE 0 END) as AGE_21_40,
SUM(CASE WHEN SAILOR_AGE BETWEEN 41 AND 60 THEN 1 ELSE 0 END) as AGE_41_60
FROM TABLE
GROUP BY YEARS, SHIP;
您可以通过使用 CASE EXPRESSION
的单个查询来完成:
SELECT t.years,t.ship,
CASE WHEN t.Sailor_age between 21 and 40 then 'From 20th to 40th'
WHEN t.Sailor_age between 41 and 60 then 'From 40th to 60th'
ELSE 'Other Ages'
END as Range
FROM YourTable t
GROUP BY t.years,t.ship,CASE WHEN t.Sailor_age between 21 and 40 then 'From 20th to 40th' WHEN t.Sailor_age between 41 and 60 then 'From 40th to 60th' ELSE 'Other Ages' END
ORDER BY t.years,t.ship,Range
或者,如果您希望使用条件聚合将其作为单行:
SELECT t.years,t.ship,
COUNT(CASE WHEN t.Sailor_age between 21 and 40 then 1 end) as Age_21_to_40,
COUNT(CASE WHEN t.Sailor_age between 41 and 60 then 1 end) as Age_41_to_60,
FROM YourTable t
GROUP BY t.years,t.ship
ORDER BY t.years,t.ship
我认为实现这一目标的最佳方法是创建助手 table:
DECLARE @hlptbl TABLE(DescOfGrp VARCHAR(50), AgeFrom INT, AgeTo INT)
INSERT INTO @hlptbl (DescOfGrp, AgeFrom, AgeTo)
VALUES('20 to 40', 20, 40),
('41 to 60', 40, 60)
然后,您必须以这种方式加入数据:
SELECT t1.[Year], t1.SHIP, t2.DescOfGrp, COUNT(t1.SHIP) AS Number
FROM TableA As t1 INNER JOIN @hlptbl AS t2 ON
t1.SAILOR_AGE>=t2.AgeFrom AND t1.SAILOR_AGE <=t2.AgeTo
GROUP BY t1.[Year], t1.SHIP, t2.DescOfGrp
结果:
Year SHIP DescOfGrp Number
2001 Flying dolphin 20 to 40 3
2003 Columbine 41 to 60 2
2003 Flying dolphin 20 to 40 6
2003 Flying dolphin 41 to 60 2
因此 - 给定标签 - 很可能是 Access SQL,你可以这样做:
SELECT
YEAR,
SHIP,
INT(SAILOR_AGE / 20) * 20 AS AgeGroup,
COUNT(*) As [NUMBERS]
FROM
TABLE
GROUP BY
YEAR,
SHIP,
INT(SAILOR_AGE / 20) * 20
对于航行(年、船),我如何在标准 SQL 或 MS-ACCESS 中按年龄间隔对水手进行分组和计数?
YEAR SHIP SAILOR_AGE
2003 Flying dolphin 33
2003 Flying dolphin 33
2003 Flying dolphin 34
2001 Flying dolphin 23
2003 Flying dolphin 35
2001 Flying dolphin 38
2001 Flying dolphin 31
2003 Flying dolphin 36
2003 Columbine 41
2003 Columbine 42
2003 Flying dolphin 27
2003 Flying dolphin 51
2003 Flying dolphin 46
我尝试了什么:
SELECT YEAR, SHIP, SAILOR_AGE, COUNT (*) as `NUMBERS`
FROM TABLE
GROUP BY YEARS, SHIP, SAILOR_AGE;
它给我每年的水手人数:
示例:
YEAR |SHIP |SAILOR_AGE | NUMBERS
------------------------------------------
2003 | Flying dolphin| 33 | 2
如何按区间对水手年龄进行分组
示例:
From 20th to 40th year's old
From 40th to 60th year's old
您可以尝试使用 CASE
来指定以下年龄范围:
SELECT YEARS, SHIP, AgeRange, COUNT (*) as `NUMBERS`
FROM (SELECT YEAR
, SHIP
, CASE WHEN SAILOR_AGE BETWEEN 21 AND 40 THEN '21-40'
WHEN SAILOR_AGE BETWEEN 41 AND 60 THEN '41-60'
ELSE 'XX-XX' -- anything goes here
END as AgeRange
FROM YourTable
)x
GROUP BY YEARS, SHIP, AgeRange;
如果你想要列中的值,你可以使用条件聚合:
SELECT YEAR, SHIP, COUNT(*) as NUMSAILORS,
SUM(CASE WHEN SAILOR_AGE BETWEEN 21 AND 40 THEN 1 ELSE 0 END) as AGE_21_40,
SUM(CASE WHEN SAILOR_AGE BETWEEN 41 AND 60 THEN 1 ELSE 0 END) as AGE_41_60
FROM TABLE
GROUP BY YEARS, SHIP;
您可以通过使用 CASE EXPRESSION
的单个查询来完成:
SELECT t.years,t.ship,
CASE WHEN t.Sailor_age between 21 and 40 then 'From 20th to 40th'
WHEN t.Sailor_age between 41 and 60 then 'From 40th to 60th'
ELSE 'Other Ages'
END as Range
FROM YourTable t
GROUP BY t.years,t.ship,CASE WHEN t.Sailor_age between 21 and 40 then 'From 20th to 40th' WHEN t.Sailor_age between 41 and 60 then 'From 40th to 60th' ELSE 'Other Ages' END
ORDER BY t.years,t.ship,Range
或者,如果您希望使用条件聚合将其作为单行:
SELECT t.years,t.ship,
COUNT(CASE WHEN t.Sailor_age between 21 and 40 then 1 end) as Age_21_to_40,
COUNT(CASE WHEN t.Sailor_age between 41 and 60 then 1 end) as Age_41_to_60,
FROM YourTable t
GROUP BY t.years,t.ship
ORDER BY t.years,t.ship
我认为实现这一目标的最佳方法是创建助手 table:
DECLARE @hlptbl TABLE(DescOfGrp VARCHAR(50), AgeFrom INT, AgeTo INT)
INSERT INTO @hlptbl (DescOfGrp, AgeFrom, AgeTo)
VALUES('20 to 40', 20, 40),
('41 to 60', 40, 60)
然后,您必须以这种方式加入数据:
SELECT t1.[Year], t1.SHIP, t2.DescOfGrp, COUNT(t1.SHIP) AS Number
FROM TableA As t1 INNER JOIN @hlptbl AS t2 ON
t1.SAILOR_AGE>=t2.AgeFrom AND t1.SAILOR_AGE <=t2.AgeTo
GROUP BY t1.[Year], t1.SHIP, t2.DescOfGrp
结果:
Year SHIP DescOfGrp Number
2001 Flying dolphin 20 to 40 3
2003 Columbine 41 to 60 2
2003 Flying dolphin 20 to 40 6
2003 Flying dolphin 41 to 60 2
因此 - 给定标签 - 很可能是 Access SQL,你可以这样做:
SELECT
YEAR,
SHIP,
INT(SAILOR_AGE / 20) * 20 AS AgeGroup,
COUNT(*) As [NUMBERS]
FROM
TABLE
GROUP BY
YEAR,
SHIP,
INT(SAILOR_AGE / 20) * 20