1

所以有人告诉我,在 SQL 中循环不是一件可取的事情。以下问题根据年龄范围制作直方图。如您所见,所有组都是硬编码的。在这种情况下,我正在寻找的所有值都低于 100。如果这些值达到数千,该怎么办?怎样才能使它更具可扩展性?

select bins, count(*) as numbers from
(

select id, patientage,
case 
    when patientage between 20 and 29 then '20-29' 
    when patientage between 30 and 39 then '30-39'
    when patientage between 40 and 49 then '40-49'
    when patientage between 50 and 59 then '50-59'
    when patientage between 60 and 69 then '60-69'
    when patientage between 70 and 79 then '70-79'
    when patientage between 80 and 89 then '80-89'
    when patientage between 90 and 99 then '90-99'


end as bins
from patient
inner join tblhospitals on tblhospitals.hospitalnpi=patient.hospitalnpi
where (tblhospitals.hospitalname like '%university%')
) as t
group by bins
order by bins
4

3 回答 3

2

这是一个可以用其他值替换的通用形式:

select
    cast(
        patientage / cast(bucketsize as int)
            * cast(bucketsize as int) as varchar(10)) + '-' +
    cast(
        patientage / cast(bucketsize as int)
            * cast(bucketsize as int) + cast(bucketsize as int) - 1 as varchar(10))
...
于 2012-07-23T00:55:00.603 回答
1

而不是你的case语句,你可以改为分组patientage / 10 例如,如果你将查询重写为:

SELECT bins, COUNT(*) AS numbers
FROM (
    SELECT id, patientage, patientage / 10 AS bins
    FROM patient P
        INNER JOIN tblhospitals H ON H.hospitalnpi = P.hospitalnpi
    WHERE H.hospitalname LIKE '%university%'
) AS T
GROUP BY bins
ORDER BY bins

您将获得相同的数据,但您将获得 5 而不是“50-59”,这实际上只是一个可以在 SQL 之外处理的显示问题。(或者如果你真的必须,你可以对数据进行一些按摩以用于显示目的,例如将 bins * 10 和 bins * 10 + 9 转换为 varchar 等)

于 2012-07-23T00:50:34.257 回答
0

有人可能会稍微清理一下,但想法就在那里

select CAST(patientage/ 10 * 10 as varchar) + ' - ' + CAST((patientage/ 10 * 10) + 9 as varchar) as bins
于 2012-07-23T00:54:31.590 回答