Sql 以列名的形式获取行

Sql 以列名的形式获取行,sql,sql-server-2008,pivot,Sql,Sql Server 2008,Pivot,SQL Server 2008中的输入表格式: *Name* *Department* 1) abcd IT 2) abcd CTECH 3) abcd

SQL Server 2008中的输入表格式:

            *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但是你是在多个部门之间循环,这是不必要的。循环与便宜正好相反。