2015-09-12 4 views
2

У меня есть таблица с инцидентами, которая содержит столбец для числа, пострадавшего в инциденте, и столбец за число, убитое в этом инциденте. Таблица инцидентов связана с таблицей «Участники», где вы можете найти столбец для возраста человека, и есть еще одна таблица «Участники» со столбцом для типа (мужчина (id = 1), женщина (id = 2)). Итак, я хочу получить номер столбца, поврежденного, номер столбца убит, где тип - мужчина, а рядом с ним поврежден номер столбца, номер столбца убит, где тип - женщина, все группы по возрасту.SQL select column несколько раз с разными условиями

select  
ip.age as age, 
sum(i.number_injured) as injured, 
sum(i.number_killed) as killed 
from Incidents i 
inner join Participants ip on i.id = ip.incident_id 
inner join ParticipantTypes ipt on ip.type_id = ipt.id 
where ipt.id = 1 
group by ip.age 

следующие работы запроса и получения результатов только для ParticipantTypes.type = 1 (человек)

Я хочу, чтобы это что-то вроде

select  
ip.age as age, 
sum(i.number_injured) as injured where ipt.id = 1, 
sum(i.number_killed) as killed where ipt.id = 1, 
sum(i.number_injured) as injured where ipt.id = 2, 
sum(i.number_killed) as killed where ipt.id = 2, 
from Incidents i 
inner join Participants ip on i.id = ip.incident_id 
inner join ParticipantTypes ipt on ip.type_id = ipt.id 
group by ip.age 

ответ

1

Попробуйте это ....

select  
ip.age as age, 
sum(case when ipt.id=1then i.number_injured else 0     
end) as injured_by_man, 
sum(case when ipt.id=1then i.number_killed else 0 
end) as killed_by_man, 
sum(case when ipt.id=2 then i.number_injured else 0 
end) as injured_by_woman, 
sum(case when ipt.id=2 then i.number_killed else 0 
end) as killed_by_woman 

from Incidents i 
inner join Participants ip on i.id = ip.incident_id 
inner join ParticipantTypes ipt on ip.type_id = ipt.id 
group by ip.age 
1

Вы отфильтровывая woman записи с ipt.id = 1 состоянии и в inner join и where.

Кроме того, вы группируете age, что вы не хотите, как я понял из вопроса. Итак, ваш окончательный запрос должен быть.

EDIT: В соответствии с обновленными подробности о котором идет речь, следующее в запросе

select 
    ip.age, 
    sum(case when ipt.id =1 then i.number_injured else 0 end) as men_injured, 
    sum(case when ipt.id =1 then i.number_killed else 0 end) as men_killed, 
    sum(case when ipt.id =2 then i.number_injured else 0 end) as women_injured, 
    sum(case when ipt.id =2 then i.number_killed else 0 end) as women_killed 
from Incidents i 
     inner join Participants ip on i.id = ip.incident_id 
     inner join ParticipantTypes ipt on ip.type_id = ipt.id 
group by ip.age 
+0

ipt.id = в 1 внутренний присоединиться была печать ошибка и да, я знал об осуществляемом в том, где пункт. Группа по возрасту является обязательным, позволяет переписать это нравится: выбрать ip.age как возраст, сумму (i.number_injured) в качестве потерпевших, где ipt.id = 1, сумма (i.number_killed) убитыми, где IPT. id = 1, sum (i.number_injured) как поврежденный, где ipt.id = 2, сумма (i.number_killed) убита, где ipt.id = 2, от инцидентов i внутреннее соединение Участники ip на i.id = ip.incident_id внутреннее соединение УчастникиТипы ipt на ip.type_id = ipt.id группа по ip.age –

+0

@AntoniyMilenkinski: обновленный ответ на основе обновлений к quesiton. – DarkKnight

1
select  
ip.age as age, 
sum(if(ipt.id=1,i.number_injured,0)) as injured_by_man, 
sum(if(ipt.id=1,i.number_killed,0) as killed_by_man, 
sum(if(ipt.id=2,i.number_injured,0)) as injured_by_woman, 
sum(if(ipt.id=2,i.number_killed,0)) as killed_by_woman 

from Incidents i 
inner join Participants ip on i.id = ip.incident_id 
inner join ParticipantTypes ipt on ip.type_id = ipt.id 
group by ip.age 

Примечание: Приведенный выше код не проверяется. Он может содержать небольшую синтаксическую ошибку.

2
select  
    ip.age as age, 
    sum(case when ipt.id=1 then i.number_injured else 0 end)  as injured_man, 
    sum(case when ipt.id=1 then i.number_killed  else 0 end)  as killed_man, 
    sum(case when ipt.id=2 then i.number_injured else 0 end)  as injured_woman, 
    sum(case when ipt.id=2 then i.number_killed  else 0 end)  as killed_woman 
from 
    Incidents i 
inner join 
    Participants ip on i.id = ip.incident_id 
inner join 
    ParticipantTypes ipt on ip.type_id = ipt.id 
group by ip.age 

Пример результата:

age   injured_man killed_man injured_woman killed_woman 
----------- ----------- ----------- ------------- ------------ 
     30   10   1    3   1 
     31   12   1    1   6 
     32   14   2    4   4 
+1

@Rohit Gaikwad быстрее меня, я думаю :) –

+0

Спасибо, –

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