1

SQL Server に 2 つのテーブルがあります。

表 1 :部門

DeptId   Dept Name
------------------
1        Software Development
2        Testing
3        Customization

表 2 :指定

DesigId  Desig Name  DeptId
---------------------------
 1        TL          1
 2        PL          1
 3        TestEngg    2
 4        SE          3

部門を列見出しとし、対応する部門列の下にグループを指定する次の出力が必要です。

  Software Development     Testing     Customization
        TL                 TestEngg        SE
        PL             

以下のクエリを試してみましたが、ID のみを取得できます

 DECLARE @deptcols AS VARCHAR(MAX);
 DECLARE @querystr  AS VARCHAR(MAX);


select @deptcols = STUFF((SELECT distinct ',' + QUOTENAME(Dept_Id) 
              FROM Designation 
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

 set @querystr = 'SELECT ' + @deptcols + ' from 
         (
             select Desig_Name, Dept_Id,Desig_Id
             from Designation
        ) p
        pivot 
        (
           count(Desig_Id) FOR Dept_Id in (' + @deptcols + ')
        ) pv '
 execute(@querystr)
4

2 に答える 2

0

ここではPIVOTキーワードを使うべきだと思います。PIVOTを使用して、列が行になるようにデータセットを変換できます。

動的クエリを作成する必要はありません

この記事を見てください:http ://archive.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title = PIVOTData

詳細: http: //msdn.microsoft.com/en-us/library/ms177410 (v = sql.105).aspx

于 2012-12-14T07:41:07.340 に答える
0

あなたのコードはとても近かったです。特に動的バージョンを使用する場合の私の提案PIVOTは、最初に静的バージョンを作成してから、動的 SQL に変換することです。

値をハードコードする静的バージョンは次のようになります。

SELECT [Software Development], [Testing], [Customization]
from 
(
   select d.[Dept Name], 
      s.[Desig Name],
      row_number() over(partition by s.deptid order by s.desigid) rn
   from Designation s
   left join department d
      on s.[DeptId] = d.[DeptId]
) p
pivot 
(
  max([Desig Name]) 
  FOR [Dept Name] in ([Software Development], [Testing], [Customization])
) pv

SQL Fiddle with Demoを参照してください。静的バージョンでは、構文が正しく、すべての値、列などが正しい場所にあることを確認できます。

次に、構文を取得したら、動的 SQL バージョンに簡単に変換できます。

DECLARE @deptcols AS VARCHAR(MAX)
DECLARE @querystr  AS VARCHAR(MAX)

select @deptcols = STUFF((SELECT  ',' + QUOTENAME([Dept Name]) 
              FROM Department 
              GROUP BY [Dept Name], DeptId
              ORDER BY DeptId
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

set @querystr = 
      'SELECT ' + @deptcols + ' from 
         (
            select d.[Dept Name], 
                s.[Desig Name],
              row_number() over(partition by s.deptid order by s.desigid) rn
            from Designation s
            left join department d
               on s.[DeptId] = d.[DeptId]
        ) p
        pivot 
        (
           max([Desig Name]) 
           FOR [Dept Name] in (' + @deptcols + ')
        ) pv '

execute(@querystr)

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

両方とも結果が得られます。

| SOFTWARE DEVELOPMENT |  TESTING | CUSTOMIZATION |
---------------------------------------------------
|                   TL | TestEngg |            SE |
|                   PL |   (null) |        (null) |

ステートメントに行row_number() over(partition by s.deptid order by s.desigid) rnを追加したことに気付くでしょう。これにより、各 に対してSELECT複数を返すことができます。これがないと、1 つの値しか返されません。Desig NameDept Name

于 2012-12-14T10:17:05.763 に答える