Sql 具有子查询计数和groupby的查询

Sql 具有子查询计数和groupby的查询,sql,sql-server,Sql,Sql Server,下面是ERD 我想计算每个月的性别“男性”和“女性”的数量,而不考虑年份 到目前为止,我尝试的是,我可以分别计算每个月的男性和女性人数,如下所示 质疑 结果 我想要下面这样 预期结果 为了实现上述目标,我尝试以下查询 质疑 错误 下面是我正在使用MSSql的表的create语句 正如错误所说,您直接使用的是select子句中的User_Id列,该列在GROUP BY中不存在 假设用户Id在Patients表中是唯一的,则可以将相关子查询更改为更快的左联接 select datename(

下面是ERD

我想计算每个月的性别“男性”和“女性”的数量,而不考虑年份

到目前为止,我尝试的是,我可以分别计算每个月的男性和女性人数,如下所示

质疑

结果

我想要下面这样

预期结果

为了实现上述目标,我尝试以下查询

质疑

错误

下面是我正在使用MSSql的表的create语句


正如错误所说,您直接使用的是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)