Sql 获取较大组的百分比

Sql 获取较大组的百分比,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,下面的查询有点难看,所以我希望我已经把它隔开了足够的空间,使它可读。查询将查找来自某个地区的特定医院就诊人数的百分比。例如,如果有100人住在X县,20人去医院A,80人去医院B,则查询输出。这类事情到底是怎么做的?如果我需要记录查询或我能做的任何事情来让它更清楚,请告诉我 hospital A 20 hospital B 80 下面的查询工作原理与我希望的完全相同,但它让我思考:如何为我表中的每个县都这样做 select hospitalname, round(cast(counts as

下面的查询有点难看,所以我希望我已经把它隔开了足够的空间,使它可读。查询将查找来自某个地区的特定医院就诊人数的百分比。例如,如果有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
part)

County列中的Counts是“TBLStateCountries_1.countyName”之后的(选择count(*)部分

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)

这是我的猜测。您必须根据您的数据进行测试,或者提供适当的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;

“循环”在大多数情况下应该像黑板上的钉子一样。当然,有一种方法可以解决这个问题,使用县名称作为一个附加分组,你能展示几行样本数据吗,这样我们就知道你是如何达到20/80的?当然,编辑在查询的主块下面。我没有回答这个问题吗@烧杯我不熟悉
coalesce
,我也不太确定它是如何工作的。