2016-02-29 2 views
-3

у меня есть эти две таблицы:SQL запросов для этих двух таблиц

Person

Name Gender RegionID 
Bob  Male 1 
Mary Female 2 
Jane Female 3 
Chris Male 1 
Paul Male 2 
Matt Male 2 
Jenny Female 1 

Регион

ID Region 
1 North 
2 South 
3 Central 

Я хотел бы закончить с таблицей, как это :

Region Male Female 
North 2  1 
South 2  1 
Central 0  1 

я первый пытался получить результирующую таблицу с идентификатором региона там так не требуется присоединиться:

select RegionID, Gender, count(Name) from Person group by RegionID 

Но поле Пол возвращается не определено. И не знал, куда идти оттуда.

Как указано, я использую библиотеку JavaScript alasql.

+0

Вы попробовали что-нибудь? – MusicLovingIndianGirl

+1

Укажите ваши РСУБД и: Что вы пробовали до сих пор? Подсказки: «INNER JOIN» с идентификатором Region и «GROUP BY» – Shnugo

+0

Совет: сначала выполните соединение, затем добавьте GROUP BY. Используйте выражения CASE. – jarlh

ответ

1

Попробуйте посмотреть на это:

SELECT A.Region 
    , SUM(CASE WHEN Gender = 'Male' Then 1 else 0 end) Male 
    , SUM(CASE WHEN Gender = 'Female' Then 1 else 0 end) Female 
FROM Region A 
Inner Join Person B 
On A.ID = B.RegionID 
Group By A.Region 
+0

Я бы оставил присоединиться, чтобы получить 0, если в регионе нет людей. – jarlh

+0

Я согласен с тобой. То есть, если он все еще хочет показать это с нулевым значением, просто чтобы показать, в каких регионах есть, но если он хочет показать только тех, у кого есть люди, тогда он может придерживаться внутреннего соединения. @Submits это ваш выбор. – Kim

+0

Спасибо, ваш ответ мне очень помог. – Submits

1

Вы можете использовать этот

select region 
,sum(case when b.Gender='Male' then 1 else 0 end) Male 
,sum(case when b.Gender='Female' then 1 else 0 end) Female 
from Region a 
inner join Person b on a.[Id]=b.RegionID 
group by a.[Id],a.Region 
order by [id] 

В TSQL вы можете вертеться, что может быть проще, если у вас есть больше, чем несколько значений для поворота на :

Select * from 
(select Region ,Gender 
    from Region a 
    inner join Person b on a.[Id]=b.RegionID) p 
pivot 
(count(Gender) 
for Gender 
IN ([Male],[Female]) 
) pivottable 

Если добавить третий пол, Недвоичные как этот

insert into Person values ('Kim','Nonbinary',3) 

Вы можете легко расширить вы запрашиваете, чтобы учесть, что:

Select * from 
(select Region ,Gender 
    from Region a 
    inner join Person b on a.[Id]=b.RegionID) p 
pivot 
(count(Gender) 
for Gender 
IN ([Male],[Female],[Nonbinary]) 
) pivottable 
order by a.[id] 
1

Для тех, кто ищет для окончательного решения в alasql, это то, что я придумал, благодаря помощи со стороны этой страницы:

var res = alasql("SELECT regionData.Title \ 
         , SUM(CASE WHEN peopleData.Gender = 'Male' THEN 1 ELSE 0 END) AS Male \ 
         , SUM(CASE WHEN peopleData.Gender = 'Female' THEN 1 ELSE 0 END) AS Female \ 
         FROM ? regionData LEFT JOIN ? peopleData \ 
         ON regionData.ID = peopleData.RegionID\ 
         GROUP BY regionData.Title", [regionData, bensData]); 
Смежные вопросы