2013-08-31 65 views
1

我正在使用MS Access這個如何統計一個ID從不同的表中出現的次數

我正在UFC戰鬥上建立一個訪問數據庫。我有一個fightschedule表,每個戰鬥的每個戰鬥機的ID和戰鬥的勝利者。我試圖做出一個查詢,列出每一個戰鬥機的戰鬥,並列出每個人有多少勝利。

這是我fightSchedule表的例子

ID Fighter1 Fighter2 Weight Class   Date Winner 
    A 205   215   Light Heavyweight 8/14/2013 205 
    B 206   212   Welterweight  8/15/2013 212 
    C 207   218   Middleweight  8/14/2013 207 
    D 208   209   Heavyweight   8/14/2013 209 

因此,對於例如我想要一個查詢,會是這個樣子:

Fighter  # of Wins 
    205    1 
    206    0 
    207    1 
    208    0 
    209    1 
    212    1 
    215    0 
    218    0 

我不知道很多關於什麼會去做這件事。我知道如何使用count函數,但不知道如何在這個例子中使用它。

我在W3學校發現了這個,但我不知道這是否正確使用或如何使用它。

SELECT column_name, COUNT(column_name) 
    FROM table_name 
    GROUP BY column_name 

任何幫助,將不勝感激。謝謝!

+1

您使用的是什麼RDBMS? –

+0

我使用MS Access – Tommy

回答

1

這其實並不難。你需要建立在嬰兒的步驟查詢:)

1選擇曾經戰鬥至少一個拼的所有戰機,但不要指望那些不止一次說打了好幾戰:

select distinct fighter1 from 
(
    select fighter1 from fightSchedule 
    union select fighter2 from fightSchedule 
) 

2 )選擇勝了,實際上贏得了戰機數量:
(這基本上是您在W3Schools的發現查詢)

select winner, count(winner) as Wins 
from fightSchedule 
group by winner 

3)結合前兩個疑問:

  • 我們需要第一個查詢中的戰士列表和第二個查詢中的勝利列表,所以我們需要JOIN這兩個查詢。
  • 並非每個戰鬥機都贏得了他的一場戰鬥,所以不是所有來自第一個查詢的戰士都出現在第二個查詢中。
  • 這就是爲什麼我們需要做一個LEFT JOIN,這意味着我們從第一個查詢中的所有行,只有那些從第二個查詢
    (標準INNER JOIN會從作爲第一個查詢過濾掉所有的行匹配在第二個查詢失蹤)

在MS Access中,有兩種方法怎麼做第二個查詢:

如果保存前兩個查詢,在Access中的命名查詢它更容易。
然後你就可以查詢他們像在第三查詢表:

select fighter1 as Fighter, nz(wincount,0) as Wins 
from qryFighters 
    left join qryWinners 
    on qryFighters.fighter1 = qryWinners.winner 

(這是一個品味的問題前面加上東西查詢的名字,如qry我只是做了它在這個例子中強調的是他們」重新查詢,而不是「常規」表)

如果你不想查詢保存爲名爲Access查詢,你可以做得一樣好,一個很大的SQL語句,雖然這是比較複雜的,並有可能如果您在SQL方面經驗不足,可能會使您感到困惑:

select fighter1 as Fighter, nz(wincount,0) as Wins 
from 
(
    select distinct fighter1 from 
    (
     select fighter1 from fightSchedule 
     union select fighter2 from fightSchedule 
    ) 
) as fighters 
left join 
(
    select winner, count(winner) as wincount 
    from fightSchedule 
    group by winner 
) as winners 
on fighters.fighter1 = winners.winner 
2

通常情況下,您要做的是將列轉換爲行。在不同的RDBMS中有幾種方法可以做到這一點。
由於您沒有指定RDBMS,因此我將以非常一般的方式開始 - 使用union all來反轉色譜柱。我覺得這個查詢在任何RDBMS工作:

select 
    Fighter, 
    sum(Wins) as Wins 
from 
(
    select 
     Fighter1 as Fighter, 
     case when Fighter1 = Winner then 1 else 0 end as Wins 
    from fightSchedule 
    union all 
    select 
     Fighter2 as Fighter, 
     case when Fighter2 = Winner then 1 else 0 end as Wins 
    from fightSchedule 
) as a 
group by Fighter 

sql fiddle demo

在另一方面,對於SQL Server,您可以使用outer apply

select 
    C.Fighter, 
    sum(C.Wins) as Wins 
from fightSchedule 
    outer apply (
     select Fighter1, case when Fighter1 = Winner then 1 else 0 end 
     union all 
     select Fighter2, case when Fighter2 = Winner then 1 else 0 end 
    ) as C(Fighter, Wins) 
group by C.Fighter 
+0

非常感謝您的回覆。我正在使用微軟訪問,我不確定如何使用它。我把它放在我的Builder中,它告訴我語法不正確。我對訪問有着平庸的經驗,對SQL代碼很少,所以我不確定我應該編輯什麼 – Tommy

相關問題