您正在尝试做的事情被称为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
range
注意:反引号适用于 MySQL,如果 SQL Server 则在and周围使用方括号count
。这些用于转义保留字。
如果您在具有PIVOT
功能的 RDBMS 中工作,则可以使用以下内容:
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