1

私が抱えている問題は、私が見つけようとしているもののテーブルに複数の結果があるということです。だから私がこれを持っているなら:

SELECT DISTINCT student.ident AS [Ident],
     proghist.prgc AS [Test Code]
FROM student 
LEFT OUTER JOIN proghist

一部の学生には、複数の「テストコード」が表示されるため、次のようになります。

Ident   Test Code
123456   1
123456   4
654321   2
654321   6
122222   1

それらを1つの行と別々の列に結合する方法はありますか?

編集:データを最終結果に入れたい:

123456 1 4 
654321 2 6 
122222 1
4

1 に答える 1

3

SQL Serverを使用しているため、SQL Server 2005以降を使用している場合は、このPIVOT関数を使用できます。TestCodes1つあたり最大2つしかないことがわかっている場合はident、値をハードコーディングできます。

select ident,
  [1] TestCode1,
  [2] TestCode2
from
(
  SELECT  s.ident AS Ident,
    p.prgc AS TestCode,
    row_number() over(partition by s.ident order by p.prgc) rn
  FROM student s
  LEFT OUTER JOIN proghist p
    on s.ident = p.ident
) src
pivot
(
  max(TestCode)
  for rn in ([1], [2])
) piv

SQL FiddlewithDemoを参照してください

の値の数が不明な場合はTestCodes、動的SQLをPIVOTデータに使用できます。

DECLARE @cols AS NVARCHAR(MAX),
    @colsPivot AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(rn)
                    FROM
                    (
                      select cast(row_number() over(partition by s.ident order by p.prgc) as varchar(50)) rn
                      FROM student s
                      LEFT OUTER JOIN proghist p
                        on s.ident = p.ident
                    ) src
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @colsPivot = STUFF((SELECT distinct ',' + QUOTENAME(rn) + ' as TestCode'+rn
                    FROM
                    (
                      select cast(row_number() over(partition by s.ident order by p.prgc) as varchar(50)) rn
                      FROM student s
                      LEFT OUTER JOIN proghist p
                        on s.ident = p.ident
                    ) src
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT Ident, ' + @colsPivot + ' from 
             (
               SELECT  s.ident AS Ident,
                p.prgc AS TestCode,
                row_number() over(partition by s.ident order by p.prgc) rn
              FROM student s
              LEFT OUTER JOIN proghist p
                on s.ident = p.ident
            ) src
            pivot 
            (
                max(TestCode)
                for rn in (' + @cols + ')
            ) p '

execute(@query)

SQL FiddlewithDemoを参照してください

関数にアクセスできない場合は、次のステートメントPIVOTで集計関数を使用できます。CASE

select ident,
  max(case when rn = 1 then testcode else '' end) TestCode1,
  max(case when rn = 2 then testcode else '' end) TestCode2
from
(
  SELECT  s.ident AS Ident,
    p.prgc AS TestCode,
    row_number() over(partition by s.ident order by p.prgc) rn
  FROM student s
  LEFT OUTER JOIN proghist p
    on s.ident = p.ident
) src
group by ident

SQL FiddlewithDemoを参照してください

3つすべてが同じ結果を生成します。

|  IDENT | TESTCODE1 | TESTCODE2 |
----------------------------------
| 122222 |         1 |         0 |
| 123456 |         1 |         4 |
| 654321 |         2 |         6 |
于 2012-11-26T19:47:01.273 に答える