SQL 查询这两个表

SQL Query For These Two Tables

我有这两个 table:

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

我想以这样的 table 结束:

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

我首先尝试获取包含区域 ID 的结果 table,因此不需要加入:

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

但是“性别”字段未定义。并且真的不知道从那里去哪里。

如所标记,我正在使用 alasql JavaScript 库。

试着看看这个:

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

你可以使用这个

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]

对于在 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]);