Oracle - 从表

时间:2018-04-05 05:21:35

标签: sql oracle

我有以下患者和预约表。

患者

CREATE TABLE Patient
(
patientID number(10),
firstName varchar2(50) NOT NULL,
middleName varchar2(50),
surName varchar2(50) NOT NULL,
p_age number(10) NOT NULL,
p_gender char(1),
p_address varchar2(200),
p_contact_no number(10),
medicalHistory varchar2(500),
allergies varchar2(200),
CONSTRAINT PK_Patient PRIMARY KEY (patientID)
);

预约

    CREATE TABLE Appointment
(
appID number(10),
patientId number(10),
staffId number(10),
appDateTime TIMESTAMP(3),
CONSTRAINT PK_Appointment PRIMARY KEY (appID),
CONSTRAINT FK_Appointment_Patient FOREIGN KEY (patientId) REFERENCES Patient(patientID) ON DELETE CASCADE,
CONSTRAINT FK_Appointment_Staff FOREIGN KEY (staffId) REFERENCES Staff(staffID) ON DELETE CASCADE
);

我希望获得最多和最少预约患者的患者详细信息。

我之前在SQL Server中编写了查询,现在我想将其更改为oracle。任何人都可以帮助我吗?

这是我到目前为止所拥有的。

SELECT p.patientId, p.firstName,
                Count(a.appId)              AS Count,
                MAX(Count(a.appId)) OVER () AS MaxMyGroup,
                MIN(Count(a.appId)) OVER () AS MinMyGroup
         FROM   Patient p INNER JOIN Appointment a ON p.patientID = a.patientId
         GROUP  BY p.patientId, p.firstName

SQL查询

WITH s
     AS (SELECT p.patientId, p.firstName,
                Count(a.appId)              AS [Count],
                MAX(Count(a.appId)) OVER () AS [MaxMyGroup],
                MIN(Count(a.appId)) OVER () AS [MinMyGroup]
         FROM   Patient p INNER JOIN Appointment a ON p.patientID = a.patientId
         GROUP  BY p.patientId, p.firstName)
SELECT patientId AS ID,
       firstName AS 'First Name',
       V.[Count] AS 'Appointment Count',
       Agg AS 'MAX/MIN'
FROM   s
CROSS APPLY (VALUES ( 'Most', CASE WHEN [Count] = [MaxMyGroup] THEN [Count] END),
                     ('Least', CASE WHEN [Count] = [MinMyGroup] THEN [Count] END))
             V(Agg, [Count])
WHERE V.[Count] IS NOT NULL

2 个答案:

答案 0 :(得分:0)

检查这是否有帮助。

SELECT *
FROM PATIENT P
WHERE EXISTS
(SELECT PATIENTID,
  COUNT(*)
FROM APPOINTMENT A
GROUP BY PATIENTID
HAVING P.PATIENTID = A.PATIENTID
AND (COUNT(*)     >=
  (SELECT MAX(COUNT(*)) FROM APPOINTMENT A2 GROUP BY A2.PATIENTID
  )
OR COUNT(*) <=
  (SELECT MIN(COUNT(*)) FROM APPOINTMENT A3 GROUP BY A3.PATIENTID
  ) )
)

答案 1 :(得分:0)

您的查询几乎就在那里 - 您只需要过滤约会的数量是否等于约会的最小或最大数量。 (您可能还想使用LEFT OUTER JOIN而不是INNER JOIN。)

SELECT patientId,
       firstName,
       NumAppt,
       CASE NumAppt
         WHEN MinAppt
         THEN 'Least'
         ELSE 'Most'
       END AS category
FROM   (
  SELECT p.patientId,
         p.firstName,
         Count(a.appId)              AS NumAppt,
         MAX(Count(a.appId)) OVER () AS MaxAppt,
         MIN(Count(a.appId)) OVER () AS MinAppt
  FROM   Patient p
         LEFT OUTER JOIN Appointment a
         ON ( p.patientID = a.patientId )
  GROUP  BY p.patientId, p.firstName
)
WHERE NumAppt IN ( MinAppt, MaxAppt );