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

「50-59」の代わりに5を取得することを除いて、同じデータを取得します。これは、SQLの外部で処理できる表示の問題です。(または、本当に必要な場合は、ビン*10およびビン*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 に答える