3 Stimmen

Verbinden von zwei Unterabfragen oder einer Abfrage mit einer Unterabfrage SQL Server 2008

Monster edit: Die Abfrage läuft jetzt, liefert aber falsche Antworten. Ein grobes Schema wurde hinzugefügt. PatientID ist nicht der Primärschlüssel in der Tabelle tblPatientVisits, weil dieselbe PatientID mehr als einmal vorhanden sein kann.

Jeder Bezirksname wird aufgeführt, aber jeder count(s.countyName) und count(t.countyname) als 1

PatientVisits   
PatientID   int
PatientState    varchar(2)
patientCounty   varchar(3)
visitNumber int - PK

tblStateCounties    
CPK stateCode   varchar(2)
CPK countyCode  varchar(3)
countyName  varchar(25)

SELECT t.countyName,
    count(t.countyName) as reAdmits ,count(s.countyName) as totalVisits
FROM (
    SELECT countyName,count(countyName) AS readmitCounts
    FROM (
        SELECT tblPatient.patientID
            ,tblStateCounties.countyName
        FROM tblPatient
        INNER JOIN tblPatientVisits
            ON tblPatient.patientID = tblPatientVisits.patientID
        INNER JOIN tblStateCounties
            ON tblPatientVisits.patientState = tblStateCounties.stateCode
                AND tblPatientVisits.patientCounty = tblStateCounties.countyCode
        GROUP BY tblPatient.patientID
            ,tblStateCounties.stateCode
            ,tblStateCounties.countyName
        HAVING (COUNT(tblPatient.patientID) > 1)
            AND (tblStateCounties.stateCode = '21')
        ) t
    GROUP BY countyname
    ) t
INNER JOIN (
    SELECT countyName
    FROM (
        SELECT tblStateCounties.countyName
            ,COUNT(tblStateCounties.countyName) AS counts
        FROM tblPatient
        INNER JOIN tblPatientVisits
            ON tblPatient.patientID = tblPatientVisits.patientID
        INNER JOIN tblStateCounties
            ON tblPatientVisits.patientState = tblStateCounties.stateCode
                AND tblPatientVisits.patientCounty = tblStateCounties.countyCode
        WHERE (tblStateCounties.stateCode = '21')
        GROUP BY tblStateCounties.countyName
        ) z
    ) s
    ON s.countyName = t.countyName
    group by s.countyname, t.countyname

edit: Ich habe eine Abfrage, die jetzt läuft, aber sie gibt zurück

10voto

Aaron Bertrand Punkte 259330

Ohne Beispieldaten und gewünschte Ergebnisse ist es schwer zu sagen, aber vielleicht ist es das, was Sie suchen?

;WITH x AS 
(
  SELECT c.CountyName, v.patientCounty, v.patientState, p.patientID
    FROM dbo.tblPatient AS p
    INNER JOIN dbo.tblPatientVisits AS v
    ON p.patientID = v.patientID 
    INNER JOIN dbo.tblStateCounties AS c 
    ON v.patientState = c.stateCode 
    AND v.patientCounty = c.countyCode
  WHERE c.stateCode = '21'
),
y AS (SELECT CountyName, c = COUNT(*) FROM x GROUP BY CountyName),
z AS (SELECT CountyName, c = COUNT(PatientID) FROM x 
  GROUP BY CountyName, patientState, PatientID HAVING COUNT(*)>1)
SELECT y.countyName, reAdmits = MAX(COALESCE(z.c, 0)), totalVisits = MAX(y.c)
FROM y LEFT OUTER JOIN z
ON y.CountyName = z.CountyName
GROUP BY y.CountyName;

1voto

Gordon Linoff Punkte 1198148

Es scheint mehrere Probleme mit dieser Abfrage zu geben. Ich nehme an, dass die Unterabfrage für "s" durch "s" in der vorherigen Abfrage ersetzt werden soll. Sind Sie mit der "with"-Syntax vertraut? Dies käme Ihrer Formulierung sehr nahe.

In jedem Fall fehlt in Ihrer ersten Unterabfrage ein ") " zwischen der HAVING-Klausel und der GROUP BY. Außerdem hat die Unterabfrage "s" eine GROUP BY, aber "SELECT *".

Das Folgende könnte das sein, was Sie auszudrücken versuchen:

select t.countyName, count(t.countyName), s.countyName, count(s.countyName)
from (select countyName, count(countyName) as readmitCounts
      from (SELECT tblPatient.patientID, tblStateCounties.countyName
            FROM tblPatient INNER JOIN
                 tblPatientVisits
                 ON tblPatient.patientID = tblPatientVisits.patientID INNER JOIN
                 tblStateCounties
                 ON tblPatientVisits.patientState = tblStateCounties.stateCode AND
                    tblPatientVisits.patientCounty = tblStateCounties.countyCode
            GROUP BY tblPatient.patientID, tblStateCounties.stateCode, tblStateCounties.countyName
            HAVING (COUNT(tblPatient.patientID) > 1) AND (tblStateCounties.stateCode = '21')
           ) t
      group by countyname
     ) t inner join
     (select tblStateCounties.countyName
      from (SELECT tblStateCounties.countyName, COUNT(tblStateCounties.countyName) AS counts
            FROM tblPatient INNER JOIN
                 tblPatientVisits
                 ON tblPatient.patientID = tblPatientVisits.patientID INNER JOIN
                 tblStateCounties
                 ON tblPatientVisits.patientState = tblStateCounties.stateCode AND 
                    tblPatientVisits.patientCounty = tblStateCounties.countyCode
            WHERE (tblStateCounties.stateCode = '21')
       GROUP BY tblStateCounties.countyName
     )
     on s.countyName = t.countyName

0voto

GarethD Punkte 66029

Ich denke, dass Sie Ihr Problem zu sehr verkomplizieren und dass dies getan werden kann, ohne 2 Abfragen zusammen zu mischen:

SELECT  t.countyName, 
        SUM(Admissions) AS TotalAdmissions,
        COUNT(*) AS TotalPatients,
        COUNT(CASE WHEN Admissions > 1 THEN PatientID END) AS TotalPatientsReadmitted
        SUM(Admissions - 1) AS TotalReadmissions
FROM    (   SELECT  tblPatient.PatientID,
                    tblStateCounties.countyName,
                    COUNT(*) AS Admissions
            FROM    tblPatient 
                    INNER JOIN tblPatientVisits 
                        ON tblPatient.patientID = tblPatientVisits.patientID 
                    INNER JOIN tblStateCounties 
                        ON tblPatientVisits.patientState = tblStateCounties.stateCode 
                        AND tblPatientVisits.patientCounty = tblStateCounties.countyCode
            WHERE   tblStateCounties.stateCode = '21'
            GROUP BY tblPatient.PatientID, tblStateCounties.countyName
        ) AS t
GROUP BY CountyName

Ich habe gerade Ihre FROM et JOINS um die Daten zu erhalten, die Sie meiner Meinung nach benötigen (und noch ein wenig mehr). Ich hoffe, dass ich den Spalten sinnvolle Namen gegeben habe, so dass es offensichtlich ist, was jede einzelne Spalte anzeigen soll.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X