自首次获奖以来,我拥有诺贝尔奖获奖者数据库。数据来源是:http://www.aggdata.com/awards/nobel_prize_winners
它有一个单独的表,因此没有外键也没有任何ER。
该表有以下12列:Id,年份,类别,姓名,出生日期,出生地,县,居住地,角色/会员,字段/语言,奖品名称,动机。
显然,物理,医学等类别有多个获胜者。
我一直在尝试使用查询查看每个类别每个类别的诺贝尔奖获得者人数。我希望我的结果表看起来像:
______________________________________________
1960-1969 Peace 9 winners
1960-1969 Physics 19 winners
..............................................
1970-1979 Peace 6 winners
1960-1969 Physics 12 winners
..............................................
______________________________________________
这可以通过MySQL中的查询来实现吗?
非常感谢您的关注。谢谢大家/
答案 0 :(得分:0)
以下是一些想法:
假设您想将十年表示为xxx0-xxx9,并假设award_date是DATE数据类型,您可以使用表达式获取年份的前三个字符:
SUBSTR(DATE_FORMAT(t.award_date,'%Y'),1,3)
这样的查询可能会让你开始。
SELECT CONCAT(s.ccy,'0-',s.ccy,'9') AS decade
, s.category
, CONCAT(s.count_winners,' winners') AS winners
FROM (
SELECT SUBSTR(DATE_FORMAT(t.award_date,'%Y'),1,3) AS ccy
, t.category
, COUNT(1) AS count_winners
FROM mytable t
WHERE t.award = 'winner'
GROUP
BY SUBSTR(DATE_FORMAT(t.award_date,'%Y'),1,3)
, t.category
) s
作为s
别名的内联视图执行繁重的工作以获取结果,外部查询执行一些格式化。
请注意,此查询不会返回任何“零”计数。
如果你还需要为所有几十年的所有类别包括“零”计数,那么也可以通过引入“所有类别”和“所有几十年”的行来源,然后进行交叉连接来完成在这些和左边的连接之间以内嵌视图别名为s
。
上述查询未返回包含“0”计数
答案 1 :(得分:0)
这是一种更多的SQL方法:
select concat(floor(npw.year / 10)*10, '-', floor(npw.year / 10)*10+9) as decade,
npw.category,
count(*) as winners
from NobelPriceWinners npw
group by floor(npw.year / 10), npw.category
order by decade, category;
这产生三列:
Decade Category Winners
1960-1969 Peace 9
1960-1969 Physics 19
. . .