Sql 每月参赛人数
我有一些类似于下面的情况,可能不是最好的例子,但有点类似于我真正拥有的。假设我有4张表,由于某些情况,我无法更改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
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应该是另一个表的键。您还应该将医生和医院连接拆分到一个单独的表中,这样您就不会有重复的信息。对于这个示例,它足够小了,但是稍后您应该规范化数据。