Sql 具有子查询计数和groupby的查询
下面是ERD 我想计算每个月的性别“男性”和“女性”的数量,而不考虑年份 到目前为止,我尝试的是,我可以分别计算每个月的男性和女性人数,如下所示 质疑 结果 我想要下面这样 预期结果 为了实现上述目标,我尝试以下查询 质疑 错误 下面是我正在使用MSSql的表的create语句Sql 具有子查询计数和groupby的查询,sql,sql-server,Sql,Sql Server,下面是ERD 我想计算每个月的性别“男性”和“女性”的数量,而不考虑年份 到目前为止,我尝试的是,我可以分别计算每个月的男性和女性人数,如下所示 质疑 结果 我想要下面这样 预期结果 为了实现上述目标,我尝试以下查询 质疑 错误 下面是我正在使用MSSql的表的create语句 正如错误所说,您直接使用的是select子句中的User_Id列,该列在GROUP BY中不存在 假设用户Id在Patients表中是唯一的,则可以将相关子查询更改为更快的左联接 select datename(
正如错误所说,您直接使用的是select子句中的User_Id列,该列在GROUP BY中不存在 假设用户Id在Patients表中是唯一的,则可以将相关子查询更改为更快的左联接
select
datename(month, p.EntryDate) mon,
count(case when u.Gender = 'Female' then 1 end) female_cnt,
count(case when u.Gender = 'Male' then 1 end) male_cnt
from [Patients] p left join [Users] u
on p.User_Id = u.Id
group by datename(month, p.EntryDate);
编辑:
您可以使用lookup CTE生成所有月份,然后按如下方式进行左连接:
;WITH months(mn, mon) AS
(
SELECT 1, DATENAME(MONTH,DATEADD(month,0,GETDATE())) mon
UNION ALL
SELECT mn+1, DATENAME(MONTH,DATEADD(MONTH,mn,GETDATE()))
FROM months
WHERE mn < 12
)
select
m.mon mon,
count(case when u.Gender = 'Female' then 1 end) female_cnt,
count(case when u.Gender = 'Male' then 1 end) male_cnt
from months m left join [Patients] p
on m.mon = datename(month, p.EntryDate)
left join [Users] u
on p.User_Id = u.Id
group by m.mon;
您可以尝试以下查询:
Select
datename(month, p.EntryDate) month,
COUNT(IF(u.Gender = 'Male', 1, NULL) AS MaleCount,
COUNT(IF(u.Gender = 'Female', 1, NULL) AS FemaleCount
from
[HospitalManagement].[dbo].[Patients] p,[HospitalManagement].[dbo].[Users] u
where
u.Id = p.User_Id
group by
datename(month, p.EntryDate)
我们在MySQL或Oracle中就是这样做的。但我还没有在MSSQL中尝试过。但由于这些都是标准的SQL函数,并且在MSSQL中可用,所以在MSSQL中也应该可以使用
Select datename(month, p.EntryDate) month , SUM(CASE WHEN u.Gender = 'Male' THEN 1 ELSE 0) MaleCount, SUM(CASE WHEN u.Gender = 'Female' THEN 1 ELSE 0) FemaleCount,
from [HospitalManagement].[dbo].[Patients] p,[HospitalManagement].[dbo].[Users] u
where u.Id = p.User_Id
group by datename(month, p.EntryDate)
通常情况下,我会在特定性别的情况下添加1以获得结果
注意:如果有任何语法错误,请告诉我错误,我可以更正。mysql或sql server???@JibinBalachandran sql server.6月份的女性计数为1,但我们得到的结果是2这一个有效。你能告诉我怎样才能说月份=一月,男性=0,女性=0 |月份=二月,男性=0,女性=0 |月份=四月,男性=0,女性=0。。。等等有没有办法做到这一点?它比case-when语句更快
-- Creating table 'Users'
CREATE TABLE [dbo].[Users] (
[Id] bigint IDENTITY(1,1) NOT NULL,
[Email] nvarchar(max) NULL,
[Password] nvarchar(max) NULL,
[UserName] nvarchar(max) NULL,
[Age] bigint NULL,
[Gender] nvarchar(max) NULL,
[NRIC] nvarchar(max) NULL,
[Comments] nvarchar(max) NULL,
[Address] nvarchar(max) NULL,
[ContactNo] nvarchar(max) NULL,
[FullName] nvarchar(max) NULL
);
GO
-- Creating table 'Patients'
CREATE TABLE [dbo].[Patients] (
[Id] bigint IDENTITY(1,1) NOT NULL,
[Disease] nvarchar(max) NULL,
[Occupation] nvarchar(max) NULL,
[EntryDate] datetime NULL,
[EntryTime] time NULL,
[User_Id] bigint NOT NULL
);
GO
select
datename(month, p.EntryDate) mon,
count(case when u.Gender = 'Female' then 1 end) female_cnt,
count(case when u.Gender = 'Male' then 1 end) male_cnt
from [Patients] p left join [Users] u
on p.User_Id = u.Id
group by datename(month, p.EntryDate);
;WITH months(mn, mon) AS
(
SELECT 1, DATENAME(MONTH,DATEADD(month,0,GETDATE())) mon
UNION ALL
SELECT mn+1, DATENAME(MONTH,DATEADD(MONTH,mn,GETDATE()))
FROM months
WHERE mn < 12
)
select
m.mon mon,
count(case when u.Gender = 'Female' then 1 end) female_cnt,
count(case when u.Gender = 'Male' then 1 end) male_cnt
from months m left join [Patients] p
on m.mon = datename(month, p.EntryDate)
left join [Users] u
on p.User_Id = u.Id
group by m.mon;
Select
datename(month, p.EntryDate) month,
COUNT(IF(u.Gender = 'Male', 1, NULL) AS MaleCount,
COUNT(IF(u.Gender = 'Female', 1, NULL) AS FemaleCount
from
[HospitalManagement].[dbo].[Patients] p,[HospitalManagement].[dbo].[Users] u
where
u.Id = p.User_Id
group by
datename(month, p.EntryDate)
Select datename(month, p.EntryDate) month , SUM(CASE WHEN u.Gender = 'Male' THEN 1 ELSE 0) MaleCount, SUM(CASE WHEN u.Gender = 'Female' THEN 1 ELSE 0) FemaleCount,
from [HospitalManagement].[dbo].[Patients] p,[HospitalManagement].[dbo].[Users] u
where u.Id = p.User_Id
group by datename(month, p.EntryDate)