【问题标题】:help with sql query join?帮助 sql 查询连接?
【发布时间】:2011-09-06 09:59:05
【问题描述】:

我有两张表,分别是 type(type,playerid) 和 player(playerid,date) 我必须找出每年有多少人赢得了哪种类型的球员的比赛奖项?

例如表格应该是这样的

year type      noofawards
2011 batsmen       3
2011 bowler        5
2010 batsmen       2

我可以获得每年获得的奖项总数,但不能按类型区分它们,所以我得到的是

year noofawards
2011     3 


select year , count(year) as "Number of awards"
from
(
select to_char(p.date,'YYYY') as year 
from player p, type t
where p.playerid = t.playerid
)
group by year
order by year;

我该怎么办?

【问题讨论】:

  • type(type,playerid) and player(playerid,date) ... 那么我们从哪里找到比赛记录的人呢?
  • 您可以按(或“隔离”)多个字段进行分组。探索“分组依据”语法选项。
  • 很抱歉得到的奖项数量我们要统计投球手、击球手等的数量
  • 这里缺少的是奖项表本身。您有一个玩家类型表和一个玩家/年份表。基于所提供信息的聚合为您提供了您每年拥有的不同类型的玩家。 (也许我读得太深了。)

标签: sql join count


【解决方案1】:

您是否尝试过以下操作:

select to_char(p.date,'YYYY') as year
     , type
     , count(*)
from player p, type t
where p.playerid = t.playerid
group by 1,2;

【讨论】:

  • 我只需要按年安排它们,这就是我遇到问题的地方。我无法计算类型的数量
  • 这仍然没有给我类型的总数....我得到的结果是 2011 Batsmen 1 2011 Batsmen 1 Wheras 我需要 2011 Batsmen 2
  • 我的 Year 别名和序数 GROUP BY 可能会根据使用的 RDBMS 提出挑战。 ypercube 对使用列/别名引用的 GROUP BY 的响应更加稳健。
【解决方案2】:

只需使用:

GROUP BY year
       , type

  • 大多数数据库系统都具有从日期中提取年份的功能(YEAR() 或类似名称)。
  • 保留字段或表名,如date 不是一个好主意。
  • 您还应该尝试学习JOIN 语法,而不是与WHERE 的隐式连接。

类似:

SELECT YEAR(p.date) AS awardYear
     , t.type
     , COUNT(*) AS "Number of awards"
FROM player p
  JOIN type t
    ON p.playerid = t.playerid
GROUP BY awardYear
       , t.type
ORDER BY awardYear
       , t.type ;

【讨论】:

  • 这仍然没有给我类型的总数....我得到的结果是 2011 Batsmen 1 2011 Batsmen 1 Wheras 我需要 2011 Batsmen 2
  • 我能够提取年份....只是在使子查询工作时遇到问题,它将所有类型一起添加到一个类别下....就像总数一样。 2011 年赢得 awad 的击球手总数和 2011 年赢得它的投球手总数等......
  • @user779214:你试过这个查询吗?它给你什么结果?您还可以编辑您的问题并在最后添加一小部分表格数据吗?
【解决方案3】:

既然这作业的尖叫声,我只是给出提示。

您不需要使用子查询,您需要在查询中的某个位置实际选择“类型”列。

【讨论】:

  • 那么我给你一个诚实的投票。许多学生来这里是为了寻找答案而不是帮助。很高兴看到有人真正想了解正在发生的事情。
【解决方案4】:

这应该可行:

SELECT year,
       type,
       COUNT(*) as number
FROM (
       SELECT type,
              to_char(player.date,'YYYY') as year
       FROM player
       NATURAL JOIN type
     ) AS T
GROUP BY year,
         type

【讨论】: