Sql 每月参赛人数

Sql 每月参赛人数,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一些类似于下面的情况,可能不是最好的例子,但有点类似于我真正拥有的。假设我有4张表,由于某些情况,我无法更改 CREATE TABLE [Hospital] ( [HospitalID] INT IDENTITY NOT NULL, [HospitalName] VARCHAR(MAX) NOT NULL ); CREATE TABLE [Doctors] ( [DoctorID] INT IDENTITY NOT NULL , [HospitalID] INT NOT

我有一些类似于下面的情况,可能不是最好的例子,但有点类似于我真正拥有的。假设我有4张表,由于某些情况,我无法更改

CREATE TABLE [Hospital] ( 
[HospitalID] INT IDENTITY NOT NULL,
[HospitalName] VARCHAR(MAX) NOT NULL 
);
CREATE TABLE [Doctors] (
    [DoctorID] INT IDENTITY NOT NULL , 
    [HospitalID] INT NOT NULL,
    [DoctorName] VARCHAR(MAX) NOT NULL
);
CREATE TABLE [Patient] (
[PatientID] INT IDENTITY NOT NULL , 
[DoctorID] INT NOT NULL
); 
CREATE TABLE [PatientAppointment] ( 
[PatientID] INT IDENTITY NOT NULL, 
[Date] DATETIME NOT NULL
);
我想编写一个存储过程,以一年零一个月为参数,它应该返回[HospitalName]、[DoctorsName]以及该时间段的患者预约次数。 这就是我现在所拥有的,我被困住了

CREATE PROCEDURE [dbo].[Procedure]
    @year INT , 
    @month INT 
AS
    SELECT COUNT([Date]) AS NumberOfAppointments FROM [PatientAppointment]
    WHERE MONTH([Date]) = @month AND YEAR([Date]) = @year
    SELECT [Hospital].HospitalName , [Doctors].DoctorName FROM [Doctors]
    INNER JOIN [Hospital] ON [Hospital].HospitalID = [Doctors].DoctorID 

RETURN 0
我不知道如何提取我需要的信息,我只限于一个存储过程

试试这个:

CREATE PROCEDURE [dbo].[Procedure]
    @year INT , 
    @month INT 
AS
BEGIN
    SELECT h.HospitalId, d.DoctorName, count(p.PatientId) as NumberOfAppointments
    FROM Hospital h
    INNER JOIN Doctors d
    ON h.HospitalId = d.HospitalId
    INNER JOIN Patient p
    ON d.DoctorId = p.DoctorId
    INNER JOIN PatientAppointment ap
    ON p.PatientId = ap.PatientId
    AND MONTH(ap.[Date]) = @month
    AND YEAR(ap.[Date]) = @year
    GROUP BY h.HospitalId, d.DoctorName
END

我的答案与Joachim发布的答案非常相似,但有一个非常显著的区别。如果原始查询和已经发布的优秀示例不存在,则此代码是可搜索的。既然你说你不能改变表的结构,我就不建议改变……尽管你可以在这些结构上做很大的改进

Create Procedure dbo.SomeBetterName
(
    @Date date
) AS
    select h.HospitalName
        , d.DoctorName
        , COUNT(pa.[Date]) as NumAppointments
    from Hospital h
    join Doctors d on h.HospitalID = d.HospitalID
    join Patient p on p.DoctorID = d.DoctorID
    join PatientAppointment pa on pa.PatientID = p.PatientID
    where pa.Date >= dateadd(month, datediff(month, 0, @Date), 0)
        and pa.Date < dateadd(month, datediff(month, 0, @Date) + 1, 0)
    group by h.HospitalName
        , d.DoctorName
创建过程dbo.SomeBetterName
(
@日期
)作为
选择h.HospitalName
,d.DoctorName
,将(pa[日期])计数为numappoints
来自h医院
在h.HospitalID=d.HospitalID上加入医生d
在p.DoctorID=d.DoctorID上连接患者p
在pa上加入PatientPA.PatientID=p.PatientID
其中pa.Date>=dateadd(月,datediff(月,0,@Date),0)
和pa.Date
此表结构存在很多问题,为什么患者预约表中的patientid是一个标识字段?它应该有一个apptid字段,并且患者id应该是另一个表的键。您还应该将医生和医院连接拆分到一个单独的表中,这样您就不会有重复的信息。对于这个示例,它足够小了,但是稍后您应该规范化数据。