Sql server MSSQL表查询问题
有人能告诉我在如下所示的两个表之间使用MSSQL获得正确数据结果的方法吗Sql server MSSQL表查询问题,sql-server,Sql Server,有人能告诉我在如下所示的两个表之间使用MSSQL获得正确数据结果的方法吗 **Person_Table** **Departemnt_Table** =========== ================ person_id depatment_id age department name gender dep
**Person_Table** **Departemnt_Table**
=========== ================
person_id depatment_id
age department name
gender
department_id
并且,我希望得到以下列的结果:
Department Names,
Number under 20 aged Males in each department,
number of under 20 aged Females in each department,
total number of Males in each department,
total number of Females in each department and,
Total number of Persons in each department
示例结果应该如下所示
DepartmentName|(Under20)Male|(Under20)Female|Total(M)| Total(F)| Grand Total
Department1 | 1 | 3 | 1 | 3 | 4
Department2 | 3 | 1 | 15 | 1 | 16
Department3 | 0 | 0 | 0 | 0 | 0
您需要使用GROUPBY子句和聚合函数
SELECT DT.DepartmentName,
SUM(CASE WHEN PT.age < 20 AND PT.gender='MALE' THEN 1 ELSE 0 END) As [(Under20)Male]
,SUM(CASE WHEN PT.age < 20 AND PT.gender='FEMALE' THEN 1 ELSE 0 END) As [(Under20)FeMale],
,SUM(CASE WHEN PT.gender='MALE' THEN 1 ELSE 0 END) As [Total(M)]
,SUM(CASE WHEN PT.gender='FEMALE' THEN 1 ELSE 0 END) As [Total(F)]
,COUNT(*) As [Grand Total]
FROM Departemnt_Table DT
INNER JOIN Person_Table PT ON DT.depatment_id = PT.depatment_id
GROUP BY DT.DepartmentName
选择DT.DepartmentName,
总和(当患者年龄<20岁且患者性别为“男性”时,则为1,否则为0)为[(20岁以下)男性]
,总和(当患者年龄<20岁且患者性别为女性时,则为1,否则为0结束)为[(20岁以下)女性],
,求和(当PT.gender='MALE'时为1,否则为0结束)为[总计(M)]
,求和(当PT.gender='femal'时为1,否则为0结束)为[总计(F)]
,计算(*)为[总计]
从部门表DT
DT.depatment\u id上的内部联接人员\u表PT=PT.depatment\u id
按部门名称分组
您需要使用带有聚合函数的GROUP By子句
SELECT DT.DepartmentName,
SUM(CASE WHEN PT.age < 20 AND PT.gender='MALE' THEN 1 ELSE 0 END) As [(Under20)Male]
,SUM(CASE WHEN PT.age < 20 AND PT.gender='FEMALE' THEN 1 ELSE 0 END) As [(Under20)FeMale],
,SUM(CASE WHEN PT.gender='MALE' THEN 1 ELSE 0 END) As [Total(M)]
,SUM(CASE WHEN PT.gender='FEMALE' THEN 1 ELSE 0 END) As [Total(F)]
,COUNT(*) As [Grand Total]
FROM Departemnt_Table DT
INNER JOIN Person_Table PT ON DT.depatment_id = PT.depatment_id
GROUP BY DT.DepartmentName
选择DT.DepartmentName,
总和(当患者年龄<20岁且患者性别为“男性”时,则为1,否则为0)为[(20岁以下)男性]
,总和(当患者年龄<20岁且患者性别为女性时,则为1,否则为0结束)为[(20岁以下)女性],
,求和(当PT.gender='MALE'时为1,否则为0结束)为[总计(M)]
,求和(当PT.gender='femal'时为1,否则为0结束)为[总计(F)]
,计算(*)为[总计]
从部门表DT
DT.depatment\u id上的内部联接人员\u表PT=PT.depatment\u id
按部门名称分组
声明@Person表(Person\u id int null,
年龄int null,
性别varchar(10)null,
部门(id INT null)
DECLARE@Department表(
部门id INT,部门名称Varchar(200))
插入@Department值(1,'A')中
在@Department值中插入(2,'B')
插入@Department值(3,'C')
在@Department值中插入(4,'D')
插入@Person值(1,19,'M',1)
插入@Person值(2,12,'F',1)
插入@Person值(3,30,'M',1)
插入@Person值(4,40,'F',1)
插入@Person值(5,20,'M',2)
插入@Person值(6,12,'F',2)
插入@Person值(7,30,'M',2)
插入@Person值(8,40,'F',2)
插入@Person值(9,20,'M',3)
插入@Person值(10,12,'F',3)
插入@Person值(11,30,'M',3)
插入@Person值(12,40,'F',3)
插入@Person值(13,20,'M',4)
插入@Person值(14,12,'F',4)
插入@Person值(15,30,'M',4)
插入@Person值(16,17,'F',4)
选择D.部门名称,
总和([(20岁以下)男性][(20岁以下)男性],
总和([(20岁以下)女性][(20岁以下)女性],
总额([总计(M)])[总计(M)],
总额([总额(F)])[总额(F)],
总和([总计])[总计]
从…起
(
从@Person中选择部门id,将(*)计数为[(20岁以下)男性]、0[(20岁以下)女性]、0[总数(M)]、0[总数(F)]、0[总计],其中年龄声明@Person表(Person id int null),
年龄int null,
性别varchar(10)null,
部门(id INT null)
DECLARE@Department表(
部门id INT,部门名称Varchar(200))
插入@Department值(1,'A')中
在@Department值中插入(2,'B')
插入@Department值(3,'C')
在@Department值中插入(4,'D')
插入@Person值(1,19,'M',1)
插入@Person值(2,12,'F',1)
插入@Person值(3,30,'M',1)
插入@Person值(4,40,'F',1)
插入@Person值(5,20,'M',2)
插入@Person值(6,12,'F',2)
插入@Person值(7,30,'M',2)
插入@Person值(8,40,'F',2)
插入@Person值(9,20,'M',3)
插入@Person值(10,12,'F',3)
插入@Person值(11,30,'M',3)
插入@Person值(12,40,'F',3)
插入@Person值(13,20,'M',4)
插入@Person值(14,12,'F',4)
插入@Person值(15,30,'M',4)
插入@Person值(16,17,'F',4)
选择D.部门名称,
总和([(20岁以下)男性][(20岁以下)男性],
总和([(20岁以下)女性][(20岁以下)女性],
总额([总计(M)])[总计(M)],
总额([总额(F)])[总额(F)],
总和([总计])[总计]
从…起
(
选择部门id,将(*)计算为[(20岁以下)男性]、0[(20岁以下)女性]、0[总计(M)]、0[总计(F)]、0[总计]从@Person WHERE age