2012-03-24 25 views
1

假設我有一個表會議如下如何從下面的模式中提取SQL計數?

M_DATE 
M_RACE_NO 
M_VENUE 
M_ATHLETE 

主鍵是日期,沒有比賽,場館,運動員。每個日期/比賽號碼/場地可以包含許多可能的運動員。假設針對特定運動員我希望提取日期,比賽編號,場地以及在該特定日期/比賽編號/場地中競爭的運動員的總數

例如,假設運動員博爾特在第7和第9場總兩項賽事比賽我希望像下面

2011-10-03, 4, NY, 7 
2010-24-02, 5, SY, 9 

我知道它會看起來像

SELECT M_DATE, M_RACE_NO, M_VENUE, SUM(...) FROM MEETING WHERE M_ATHLETE='Bolt' 

我不知道以後發生的事情SUM

+1

什麼RDBMS(甲骨文/ MySQL的/ ...)?它支持窗口函數 - 即「count(...)over(...)'? – Aprillion 2012-03-24 10:42:13

回答

3

如果您的RDBMS支持此:

SELECT M_DATE, M_RACE_NO, M_VENUE, 
    COUNT(*) OVER (PARTITION BY M_DATE, M_RACE_NO, M_VENUE) 
FROM MEETING 
WHERE M_ATHLETE='Bolt' 

如果沒有:

select m1.m_date, m1.m_race_no, m1.m_venue, m2.count_races 
from meeting m1 
join (select m_date, m_race_no, m_venue, count(*) count_races 
     from meeting group by m_date, m_race_no, m_venue) m2 
    on m1.m_date = m2.m_date 
    and m1.m_race_no = m2.m_race_no 
    and m1.m_venue = m2.m_venue 
where m1.m_athlete = 'Bolt' 
+0

組和加入應該是:'GROUP BY m_date,m_race_no,m_venue' – 2012-03-24 11:07:31

+0

@ypercube我錯過了所有列的主鍵,我會更新我的答案:) – Aprillion 2012-03-24 11:09:22

3
SELECT 
    m.m_date 
    , m.m_race_no 
    , m.m_venue 
    , COUNT(*) AS cnt 
FROM 
     meeting AS m 
    JOIN 
     meeting AS m2 
      ON m2.m_date = m.m_date 
      AND m2.m_race_no = m.m_race_no 
      AND m2.m_venue = m.m_venue 
WHERE 
    m.m_athlete = 'Bolt' 
GROUP BY 
    m.m_date 
    , m.m_race_no 
    , m.m_venue