あなたがやろうとしていることは、 として知られていPIVOT
ます。これは、データを行から列に変換するときです。一部のデータベースにはPIVOT
利用できる機能がありますが、どの RDBMS を指定していません。
関数がない場合は、集計関数とステートメントPIVOT
を使用して機能を複製できます。CASE
select `range`,
sum(case when class_name = 'pens' then `count` end) pens,
sum(case when class_name = 'pencil' then `count` end) pencils
from yourtable
group by `range`
デモで SQL Fiddle を参照してください
注: バッククォートは MySQL 用です。SQL Server の場合は、 と を角括弧で囲みrange
ますcount
。これらは、予約語をエスケープするために使用されます。
関数を持つ RDBMS で作業している場合はPIVOT
、次を使用できます。
select *
from
(
select class_name, [range], [count]
from yourtable
) src
pivot
(
sum([count])
for class_name in ([pens], [pencil])
) piv
デモで SQL Fiddle を参照してください
どちらも同じ結果になります。
| RANGE | PENS | PENCIL |
---------------------------
| 0-0.5 | 200 | 50 |
| 0.5-1.0 | 300 | 40 |
| 1.0-1.5 | 150 | 45 |
の値の既知の数がある場合、上記はうまく機能class_name
します。そうでない場合、RDBMS によっては、このクエリの動的バージョンを生成する方法があります。
SQL Server では、動的バージョンは次のようになります。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(CLASS_NAME)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT [range], ' + @cols + ' from
(
select CLASS_NAME, [RANGE], [COUNT]
from yourtable
) x
pivot
(
sum([COUNT])
for CLASS_NAME in (' + @cols + ')
) p '
execute(@query)
デモで SQL Fiddle を参照してください