在SQL Server 2008 R2中将行转换为列
我该如何扭转这种局面: 这是: 为此:在SQL Server 2008 R2中将行转换为列,sql,sql-server-2008-r2,pivot,Sql,Sql Server 2008 R2,Pivot,我该如何扭转这种局面: 这是: 为此: 在SQL Server 2008 R2?中,此问题与此问题非常相似,您需要将字符串数据从行聚合到列。我将修改该答案,以演示如何将数据转换为最终结果 由于您正在聚合字符串值,因此需要应用min()或max()聚合函数,但为了获得显示多行的最终结果,您需要强制多行 为此,您需要使用行编号()为名称中的每个参数生成唯一的序列号。应用PIVOT函数时,此数字将用于分组,并生成多行: select Car, Truck, Bicycle from ( se
在SQL Server 2008 R2?中,此问题与此问题非常相似,您需要将字符串数据从行聚合到列。我将修改该答案,以演示如何将数据转换为最终结果 由于您正在聚合字符串值,因此需要应用
min()
或max()
聚合函数,但为了获得显示多行的最终结果,您需要强制多行
为此,您需要使用行编号()
为名称
中的每个参数
生成唯一的序列号。应用PIVOT函数时,此数字将用于分组,并生成多行:
select Car, Truck, Bicycle
from
(
select vt.name, vp.parameter,
row_number() over(partition by vt.name
order by vt.id) seq
from vehicle_types vt
left join vehicle_parameters vp
on vt.id = vp.vehicletype
) d
pivot
(
max(parameter)
for name in (Car, Truck, Bicycle)
) piv;
看
这也可以使用带有CASE表达式的聚合函数编写:
select
max(case when name = 'Car' then parameter end) Car,
max(case when name = 'Truck' then parameter end) Truck,
max(case when name = 'Bicycle' then parameter end) Bicycle
from
(
select vt.name, vp.parameter,
row_number() over(partition by vt.name
order by vt.id) seq
from vehicle_types vt
left join vehicle_parameters vp
on vt.id = vp.vehicletype
) d
group by seq;
看
如果您有已知数量的名称,则可以对查询进行硬编码,但如果没有,则必须使用动态SQL:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(name)
from vehicle_types
group by id, name
order by id
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @cols + '
from
(
select vt.name, vp.parameter,
row_number() over(partition by vt.name
order by vt.id) seq
from vehicle_types vt
left join vehicle_parameters vp
on vt.id = vp.vehicletype
) x
pivot
(
max(parameter)
for name in (' + @cols + ')
) p '
execute sp_executesql @query;
看。所有版本都会给出一个结果:
| CAR | TRUCK | BICYCLE |
|--------|------------------|------------|
| make | maxload | frame |
| year | hasconcretemixer | isroad |
| engine | (null) | ismountain |
你听说过pivot query吗?没有。这对我有用吗?@bluefeet D'Oh。删除我的评论!但我敢肯定这个问题在这里经常得到回答。我喜欢你的第一个答案,而不是第二个,因为第二个答案是硬编码的。如果他在vehicle_type表中有更多的行怎么办。@AshReva我更新了我的答案,如果存在未知的
车辆类型,则包含一个动态sql版本
,非常感谢,它可以工作。现在我需要了解它的实际功能:)