2013-11-04 42 views
0

我有臺這樣透視表如何創建以下

DisposalID ReportID 

242   84 
243   84 

我希望看到它下面的方式

DisposalID DisposalID  ReportID 

242    243    84 

我使用數據透視表,但無法實現試過

select 
    * 
from 
(
SELECT [DisposalID] 
,[ReportID] 

FROM [ClearData_Test].[dbo].[DisposalConsolidatedView] WHERE [ReportID]=84 
) DataTable 
PIVOT 
(
    Min(disposalid) 
    FOR reportid 
    IN ([84]) 
) PivotTable 

它只給我最小或最大。任何幫助將大大appriciated。

回答

0

由於PIVOT需要聚合,您當前的查詢將只返回每個DisposalId的最小值/最大值。爲了得到您想要的結果,您必須創建將用作新列標題的列。

我會使用row_number()並通過您的ReportId分區數據。您正在使用的子查詢會稍微改變以下幾點:

SELECT [DisposalID] 
    ,[ReportID] 
    , 'DisposalId' 
     +cast(row_number() over(partition by reportId 
           order by disposalid) as varchar(10)) seq 
FROM [dbo].[DisposalConsolidatedView] 
WHERE [ReportID]=84 

SQL Fiddle with Demo。這將創建一個值爲DisposalId1DisposalId2的列 - 這些新值將成爲您的新列標題,然後您將將聚合應用於您現有的DisposalId列。

最終的語法是:

select DisposalId1, DisposalId2, ReportId 
from 
(
    SELECT [DisposalID] 
    ,[ReportID] 
    , 'DisposalId' 
     +cast(row_number() over(partition by reportId 
           order by disposalid) as varchar(10)) seq 
    FROM [dbo].[DisposalConsolidatedView] 
    WHERE [ReportID]=84 
) DataTable 
PIVOT 
(
    Min(disposalid) 
    FOR seq IN (DisposalId1, DisposalId2) 
) PivotTable; 

SQL Fiddle with Demo。這會給結果:

| DISPOSALID1 | DISPOSALID2 | REPORTID | 
|-------------|-------------|----------| 
|   242 |   243 |  84 | 
+0

完美工作就像一個魅力....一個更小的問題,如果有更多的2處置ID?它們可能有多達20個。 – user2954221

+0

@ user2954221您將必須對PIVOT'IN'子句進行硬編碼以包含最多20個列名,或使用動態SQL來創建最終結果。這裏是我的一個動態sql示例的答案 - http://stackoverflow.com/questions/19709206/pivot-table-issue-no-identifier-in-original-table-or-enumeration/19709603#19709603 – Taryn

+0

謝謝你非常。 – user2954221

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('DisposalID'+cast(seq as varchar(10))) 
       from 
       (
        select row_number() over(partition by [reportId] 
              order by disposalid) seq 
        from [ClearData_Test].[dbo].[DisposalConsolidatedView] 
       ) d 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 

set @query = 'SELECT [ReportID],' + @cols + ' 
     from 
     (
      SELECT [ReportID], disposalid, 
      ''disposalid''+ 
       cast(row_number() over(partition by [reportId] 
            order by disposalid) as varchar(10)) seq 
      FROM [ClearData_Test].[dbo].[DisposalConsolidatedView] 
      where[ReportID]=''84'' 
     ) x 
     pivot 
     (
      Min(disposalid) 
      for seq in (' + @cols + ') 
     ) p ' 

execute sp_executesql @query; 

這就是我一直在尋找的解決方案。