case ステートメントを使用して、排他的範囲のカウントを取得できます。
select case when [vendor experience] <= 6 then '0-6'
when [vendor experience] <= 12 then '0-12'
when [vendor experience] <= 18 then '0-18'
else 'more'
end [vendor_experience(months)],
count (*) [count]
from experiences
group by
case when [vendor experience] <= 6 then '0-6'
when [vendor experience] <= 12 then '0-12'
when [vendor experience] <= 18 then '0-18'
else 'more'
end
これにより、あなたと同じ結果が得られます(範囲を含む):
; with ranges as
(
select 6 as val, 0 as count_all
union all
select 12, 0
union all
select 18, 0
union all
select 0, 1
)
select case when ranges.count_all = 1
then 'more'
else '0-' + convert (varchar(10), ranges.val)
end [vendor_experience(months)],
sum (case when ranges.count_all = 1
or experiences.[vendor experience] <= ranges.val
then 1 end) [count]
from experiences
cross join ranges
group by ranges.val, ranges.count_all
count_all
オープンエンド範囲をマークするために 1 に設定されます。
Sql Fiddle はこちらです。
更新:説明の試み。
閉じ括弧で始まり閉じ括弧で終わる最初の部分はCTEwith
と呼ばれます。同じクエリで複数回使用でき、状況によっては更新可能であるため、と呼ばれることもあります。ここでは、範囲のデータを準備するために使用され、適切に名前が付けられています。この名前は、メイン クエリで使用されます。範囲の最大値です。範囲に上限がない場合は 1 です (18 以上、または任意の方法で呼び出します)。データ行は、union allによって結合されます。括弧の間のセクションのみをコピーして貼り付け、実行して結果を確認できます。inline view
ranges
Val
count_all
クロス結合を使用して、本体がexperiences
範囲を持つテーブルを結合します。これにより、 と のすべての行の組み合わせが作成されます。行の場合、4 行になります。experiences
ranges
d 11
empname vendor experience val count_all
d 11 6 0
d 11 12 0
d 11 18 0
d 11 0 1
select リストの最初の case ステートメントは、count_all をチェックすることによってキャプションを生成します。それが 1 の場合は を出力more
し、それ以外の場合は上限値を使用してキャプションを作成します。2 番目の case ステートメントは、sum(1) を使用してカウントされます。集計関数は null を無視し、一致が見つからない場合は else がない場合は null と評価されるため、count_all が true (経験からのこの行がこの範囲でカウントされることを意味する) であるかどうか、vendor experience
または上限以下であるかどうかを確認するだけで十分です。現在の範囲の範囲値。上記の例では、11 は最初の範囲ではカウントされませんが、残りはすべてカウントされます。
結果は、val と count_all によってグループ化されます。それがどのように機能するかをよりよく理解するには、group by と sum() を削除して、集計前の数値を調べます。empname で並べると、val は、従業員ごとに異なる val に応じて [count] の値がどのように変化するかを確認するのに役立ちます。
注: 私は現在の英語レベルで最善を尽くしました。1 つ (または 2 つ、または必要な数) が必要な場合は、お気軽にお問い合わせください。