0

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 テーブルのシナリオです...

示されているように出力結果の形式を取得するのを手伝ってくれる人はいますか?

4

3 に答える 3

3

データを列に変換する方法はいくつかあります。

CASE式で集計関数を使用できます。

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;

デモで SQL Fiddle を参照してください

PIVOT を使用して、データを行から列に変換できます。

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 Fiddle を参照してください

名前ごとの部門の数が不明な場合があるため、動的 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);

デモで SQL Fiddle を参照してください

于 2013-05-09T17:03:51.570 に答える
0

前提top 2 Departments: OPは名前のみを考慮したいと考えています。

1.一時テーブルを作成するRanking

select 
ROW_NUMBER()over(partition by Name order by Name) AS ver
,Name
,Department
into #temp1
from table_name;

2.今、私たちは以下をQuery

select 
DISTINCT 
t1.Name,
t2.Department as Department1,
t3.Department as Department2
from #temp1 t1
left join #temp1 t2 on t1.Name=t2.Name and t2.ver=1
left join #temp1 t3 on t1.Name=t3.Name and t3.ver=2

SQL フィドル

于 2013-05-09T16:58:37.803 に答える