2016-07-15 9 views
0

スクリーンショットが添付されています。私は入力と必要な出力の両方を述べました。私は出力を得るために、SQLサーバー2008/2012クエリが必要です。あなたはPIVOTを使用する必要がSQL SERVER 2008行を複数の列に変換するためのクエリ

Example input and output

+1

*のT-SQLの動的ピボット*は、あなたが検索するために必要なものです。 –

+0

これをチェックしてください:http://stackoverflow.com/questions/15745042/efficiently-convert-rows-to-columns-in-sql-server – TheGameiswar

+0

リンクではなくポストに直接画像を追加しました – Dave

答えて

0

あなたは、動的SQLクエリを使用することができます。

クエリ

declare @sql as varchar(max); 

select @sql = 'select ' + stuff((
      select ', max(case StudentID when ' 
      + cast(t.StudentID as varchar(10))        
      + ' then StudentKey end) as StudentID' 
      + cast(t.StudentID as varchar(10)) 
      +', max(case StudentID when ' + cast(t.StudentID as varchar(10)) 
      + ' then StudentName end) as StudentName' 
      + cast(t.StudentID as varchar(10)) 
      from (select distinct top 3 * from studentTable order by StudentID)t 
      for xml path('') 
     ), 1, 2, '') + ' from studentTable;'; 

exec(@sql); 

そしてこれには、1 StudentId、その後StudentNameとのcoulmn順に結果が得られます。以下のようなものもあります。

結果

+------------+--------------+------------+--------------+------------+--------------+ 
| StudentID1 | StudentName1 | StudentID2 | StudentName2 | StudentID3 | StudentName3 | 
+------------+--------------+------------+--------------+------------+--------------+ 
| 125  |  A  | 225  |  B  | 325  |  C  | 
+------------+--------------+------------+--------------+------------+--------------+ 

そして、あなたはまず、すべてのstudentId欄のような結果studentName列をしたい場合。その後

クエリ

declare @sql as varchar(max); 

select @sql = 'select ' + stuff((
        select ', max(case StudentID when ' 
        + cast(t.StudentID as varchar(10)) 
        + ' then StudentKey end) as StudentID' 
        + cast(t.StudentID as varchar(10)) 
        from (select distinct top 3 * from studentTable order by StudentID)t 
        for xml path('') 
        ), 1, 2, '') 
        + ',' 
        + stuff((
        select ', max(case StudentID when ' 
        + cast(t.StudentID as varchar(10)) 
        + ' then StudentName end) as StudentName' 
        + cast(t.StudentID as varchar(10)) 
        from (select distinct top 3 * from studentTable order by StudentID)t 
        for xml path('') 
        ), 1, 2, '') 
        + ' from studentTable;'; 

exec(@sql); 

結果

+------------+------------+------------+--------------+--------------+--------------+ 
| StudentID1 | StudentID2 | StudentID3 | StudentName1 | StudentName2 | StudentName3 | 
+------------+------------+------------+--------------+--------------+--------------+ 
| 125  | 225  | 325  | A   | B   | C   |  
+------------+------------+------------+--------------+--------------+--------------+ 
+0

あなたは答えが正しいです。 – Raj

+0

私は別の質問をしました。 http://stackoverflow.com/questions/38449739/sql-server-2008-query-to-pick-top-distinct-3-dynamically?noredirect=1&lq=1 – Raj

0

。それは次のようなものでなければなりません。 PIVOTの仕組みがわからない場合は、オンラインでチュートリアルを使ってExcel Pivotを試してみて、まずそのロジックをよく理解してください。

PIVOT and UNPIVOT in T-SQL

WITH PivotData AS 
(
    SELECT 
     AssignmentName, 
     StudentName, 
     Grade 
    FROM TableName 
) 

SELECT 
    StudentName, 
    Assignment1, 
    Assignment2, 
    Assignment3 
FROM PivotData 
PIVOT 
(
    SUM(Grade) 
    FOR AssignmentName 
    IN (Assignment1, Assignment2, Assignment3) 
) AS PivotResult 
ORDER BY StudentName 

Pivot in Excel

関連する問題