2012-07-20 73 views
0

下面的查詢是一種醜陋的一種,所以我希望我已經把它的間隔足夠好,以使其可讀。該查詢查找來自某個特定醫院的人員的百分比。例如,如果100個人住在X縣,20個去A醫院,80個去B醫院查詢輸出。這種事情到底是怎麼回事?讓我知道是否需要記錄查詢或我可以做的任何事情以使其更清楚。獲取較大組的百分比

hospital A 20 
hospital B 80 

下面的查詢工作完全一樣我想它,但它給我想:怎麼會這樣對我的表中每一個縣辦呢?

select hospitalname, round(cast(counts as float)/cast(fayettestrokepop as float)*100,2)as percentSeen 
from 
(

SELECT  tblHospitals.hospitalname, COUNT(tblHospitals.hospitalname) AS counts, tblStateCounties_1.countyName, 
          (SELECT  COUNT(*) AS Expr1 
          FROM   Patient INNER JOIN 
                tblStateCounties ON Patient.stateCode = tblStateCounties.stateCode AND Patient.countyCode = tblStateCounties.countyCode 
          WHERE  (tblStateCounties.stateCode = '21') AND (tblStateCounties.countyName = 'fayette')) AS fayetteStrokePop 
FROM   Patient AS Patient_1 INNER JOIN 
         tblHospitals ON Patient_1.hospitalnpi = tblHospitals.hospitalnpi INNER JOIN 
         tblStateCounties AS tblStateCounties_1 ON Patient_1.stateCode = tblStateCounties_1.stateCode AND Patient_1.countyCode = tblStateCounties_1.countyCode 
WHERE  (tblStateCounties_1.stateCode = '21') AND (tblStateCounties_1.countyName = 'fayette') 
GROUP BY tblHospitals.hospitalname, tblStateCounties_1.countyName 

) as t 
order by percentSeen desc 

編輯:樣本數據 下面的樣本數據是不帶最外層查詢(在as t order by一部分)。

的countsInTheCounty列是(SELECT COUNT(*)..)部分 'tblStateCounties_1.countyName'

hospitalName  hospitalCounts  countyName  countsInTheCounty 
st. james   23     X    300 
st. jude   40     X    300 

現在,經過與外部查詢,我們將得到

st james 0.076 (23/300) 
st. jude 0.1333 (40/300) 
+3

「循環」在大多數情況下應該像黑板上的釘子。當然,有一種方法可以解決這個問題,使用縣名作爲額外的分組,你能顯示幾行樣本數據,所以我們知道你是如何達到20/80的? – 2012-07-20 19:44:25

+0

當然,編輯在主要查詢塊之下。 – wootscootinboogie 2012-07-20 19:51:38

+0

我沒有回答這個問題嗎? http://stackoverflow.com/a/11086155/61305 – 2012-07-20 20:26:31

回答

1

這裏是我的猜測。您必須測試您的數據或提供適當的DDL +示例數據。

;WITH totalCounts AS 
(
    SELECT StateCode, countyCode, COUNT(*) AS totalcount 
    FROM dbo.Patient GROUP BY StateCode, countyCode 
) 
SELECT 
    h.hospitalName, 
    hospitalCounts = COUNT(p.hospitalnpi), 
    c.countyName, 
    countsInTheCounty = tc.totalCount, 
    percentseen = CONVERT(DECIMAL(5,2), COUNT(p.hospitalnpi)*100.0/tc.totalCount) 
FROM 
    dbo.Patient AS p 
INNER JOIN 
    dbo.tblHospitals AS h 
    ON p.hospitalnpi = h.hospitalnpi 
INNER JOIN 
    totalCounts AS tc 
    ON p.StateCode = tc.StateCode 
    AND p.countyCode = tc.countyCode 
INNER JOIN 
    dbo.tblStateCounties AS c 
    ON tc.StateCode = c.stateCode 
    AND tc.countyCode = c.countyCode 
GROUP BY 
    h.hospitalname, 
    c.countyName, 
    tc.totalcount 
ORDER BY 
    c.countyName, 
    percentseen DESC;