3

モンスターの編集: クエリは実行されるようになりましたが、間違った回答が返されます。大まかなスキーマを追加しました。同じ患者 ID が複数回存在する可能性があるため、PatientID は tblPatientVisits テーブルの主キーではありません。

すべての郡名がリストされていますが、それぞれの count(s.countyName) および count(t.countyname) は 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

編集:現在実行されているクエリがありますが、返されます

4

3 に答える 3

10

サンプル データと目的の結果がないとわかりませんが、おそらくこれが目的ですか?

;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;
于 2012-06-18T15:36:04.363 に答える
1

このクエリにはいくつかの問題があるようです。「s」のサブクエリは、以前のクエリの「s」を置き換えることを意図していると思います。「with」構文に精通していますか?これはあなたがそれを表現する方法に近いでしょう。

いずれにせよ、最初のサブクエリでは、HAVING 句と GROUP BY の間に ") " がありません。さらに、「s」サブクエリには GROUP BY がありますが、「SELECT *」です。

以下は、あなたが表現しようとしているものかもしれません:

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
于 2012-06-18T14:39:54.527 に答える
0

問題を複雑にしすぎていると思います。これは、2 つのクエリを一緒にマッシュアップしなくても実行できると思います。

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

私はあなたのFROMandJOINSを取得して、あなたが必要とするすべてのデータ(およびもう少し)だと思うものを取得しました。各列が何を表示する必要があるかが明確になるように、適切な名前を列に付けることを願っています。

于 2012-06-18T15:36:28.650 に答える