Sql 以列名的形式获取行
SQL Server 2008中的输入表格式:Sql 以列名的形式获取行,sql,sql-server-2008,pivot,Sql,Sql Server 2008,Pivot,SQL Server 2008中的输入表格式: *Name* *Department* 1) abcd IT 2) abcd CTECH 3) abcd
*Name* *Department*
1) abcd IT
2) abcd CTECH
3) abcd MECH
4) uvw SAP
5) uvw Informatica
期望输出结果:
Name Department1 Department2
1) abcd IT CTECH
2) uvw SAP Informatica
上面是我的SQL Server 2008表的场景
可以帮助我获得输出结果格式吗?< /P> < P>假设:OP只考虑名字的前2个部门。< /P>
declare @maxDept int
select @maxDept = max(numDepts)
from
(
select name, numDepts = count(dept) from depts group by name
) a
declare @deptPivot varchar(max)
set @deptPivot = ''
declare @counter int
set @counter = 1
while @counter <= @maxdept
begin
if (@deptPivot) = ''
set @deptPivot = 'department' + convert(varchar, @counter)
else
set @deptPivot = @deptPivot + ', department' + convert(varchar, @counter)
set @counter = @counter + 1
end
declare @sql varchar(max)
set @sql = '
select
name, ' + @deptPivot + '
from
(
select
name,
id = ''department'' + convert(varchar, row_number() over (partition by name order by dept asc)),
dept
from depts
) a
pivot
(
max(dept) for id in (' + @deptPivot + ')
) as pvt'
--print @sql
exec (@sql)
1.为排名创建临时表
2.现在我们来回答下面的问题
假设:OP只考虑名字的前2个部门。< /P>
1.为排名创建临时表
2.现在我们来回答下面的问题
有几种方法可以将数据转换为列
select *
from
(
select name,
department,
'Department'
+cast(row_number() over(partition by name order by department) as varchar(10)) col
from yt
) src
pivot
(
max(department)
for col in ([Department1], [Department2], [Department3])
) piv;
可以将聚合函数与大小写表达式一起使用:
select name,
max(case when rn = 1 then department end) Department1,
max(case when rn = 2 then department end) Department2,
max(case when rn = 3 then department end) Department3
from
(
select name,
department,
row_number() over(partition by name order by department) rn
from yt
) src
group by name;
看
您可以使用枢轴将数据从行转换为列
select *
from
(
select name,
department,
'Department'
+cast(row_number() over(partition by name order by department) as varchar(10)) col
from yt
) src
pivot
(
max(department)
for col in ([Department1], [Department2], [Department3])
) piv;
看
我建议使用动态SQL来获得结果,因为每个名称可能有未知数量的部门。动态SQL代码将是:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(col)
from
(
select 'department'+
cast(row_number() over(partition by name order by department) as varchar(10)) col
from yt
) src
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT name, ' + @cols + '
from
(
select name, department,
''department''+
cast(row_number() over(partition by name order by department) as varchar(10)) col
from yt
) x
pivot
(
max(department)
for col in (' + @cols + ')
) p '
execute(@query);
请参见有几种方法可以将数据转换为列
select *
from
(
select name,
department,
'Department'
+cast(row_number() over(partition by name order by department) as varchar(10)) col
from yt
) src
pivot
(
max(department)
for col in ([Department1], [Department2], [Department3])
) piv;
可以将聚合函数与大小写表达式一起使用:
select name,
max(case when rn = 1 then department end) Department1,
max(case when rn = 2 then department end) Department2,
max(case when rn = 3 then department end) Department3
from
(
select name,
department,
row_number() over(partition by name order by department) rn
from yt
) src
group by name;
看
您可以使用枢轴将数据从行转换为列
select *
from
(
select name,
department,
'Department'
+cast(row_number() over(partition by name order by department) as varchar(10)) col
from yt
) src
pivot
(
max(department)
for col in ([Department1], [Department2], [Department3])
) piv;
看
我建议使用动态SQL来获得结果,因为每个名称可能有未知数量的部门。动态SQL代码将是:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(col)
from
(
select 'department'+
cast(row_number() over(partition by name order by department) as varchar(10)) col
from yt
) src
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT name, ' + @cols + '
from
(
select name, department,
''department''+
cast(row_number() over(partition by name order by department) as varchar(10)) col
from yt
) x
pivot
(
max(department)
for col in (' + @cols + ')
) p '
execute(@query);
请参见为什么abcd名称的机械部门被抑制而未显示?考虑到abcd的三个部门-如何决定显示哪一个和忽略哪一个??在sql server pivot查询上进行谷歌搜索将让您开始。为什么abcd名称的机械部门被抑制而不显示?考虑到abcd的三个部门-如何决定显示哪一个和忽略哪一个??在sql server pivot查询上进行谷歌搜索将让您开始。这可以不用一段时间就完成,这似乎有点过分。无论如何,这个问题不值得这么精彩的回答:+1这可以不用一段时间完成,这似乎有点过分,无论如何,这个问题不值得这么好的回答:+1比while贵多少?@kgu87为什么要循环使用数据,而这可以用不同的方式轻松完成?它没有循环使用数据data@kgu87但是你在多个部门之间循环,这是不需要的。循环与便宜正好相反。比while贵得多?@kgu87为什么要循环数据?如果可以用另一种方式轻松完成,为什么不循环数据data@kgu87但是你是在多个部门之间循环,这是不必要的。循环与便宜正好相反。