2013-08-31 4 views
1

Я использую MS Access для этогоКак подсчитать количество вхождений идентификатора из другой таблицы

Делаю доступ к базе данных на UFC бои. У меня есть таблица сражений, в которой есть идентификаторы каждого бойца за каждый бой и победитель боев. Я пытаюсь сделать запрос, в котором перечислены все бойцы, которые сражались, и перечисляет, сколько выигрышей было у каждого.

Это пример моего 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

Какие СУБД вы используете? –

+0

Я использую MS-доступ – 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 я только что сделал это в этом примере, чтобы подчеркнуть, что они» re query, а не «обычные» таблицы)

Если вы не хотите сохранять запросы как запрошенные запросы доступа, вы можете сделать это также и в одном большом 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

Как правило, вы хотите развернуть столбцы в строки. Существует несколько способов сделать это в разных СУБД.
Поскольку вы не указали свои РСУБД, я начну с очень общего пути - чтобы раскрыть столбцы с union all. Я думаю, что этот запрос будет работать в любой СУБД:

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

Большое спасибо за ваш ответ. Я использую microsoft-доступ, и я не уверен, как его использовать. Я положил его в свой Builder, и он говорит мне, что синтаксис неверен. У меня средний опыт с доступом и очень мало с кодом SQL, поэтому я не уверен, что мне нужно редактировать – Tommy

Смежные вопросы