2016-05-25 119 views
-1

我有一個返回結果這樣的查詢:轉換排列在SQL Server

Location ID Location Code Location Name Division Code sSourceCode Division Name Business Unit Code Business Unit Name 
83806 D4009 Vanier Mitsubishi Fuso SALES_01 SALES_01 Sales_01 SALES DEPARTMENT Fuso Vehicle Sales Department 
83806 D4009 Vanier Mitsubishi Fuso Parts_A0 Parts_A0 Parts District A0 PARTS DEPARTMENT Fuso Parts Department 
83806 D4009 Vanier Mitsubishi Fuso SERVICE_C1 SERVICE_C1 Service Division C1 SERVICE DEPARTMENT Fuso Service Department 

我想有結果是這樣的:

Location ID Location Code Location Name Parts Division Code Parts sSourceCode Parts Division Name Sales Division Code Sales Division Name  Sales Business Unit Code Sales Business Unit Name Parts Business Unit Code Parts Business Unit Name 

因此,對於每個locationID我需要只有一行,其各自的零件/服務/銷售部門/業務單元的代碼和名稱在同一行顯示爲單獨的列....不確定我可以通過旋轉進行旋轉,如果可能的話可以有人指出我的權利或給我一些如何實現這個目標的例子。

+1

是的,你可以用旋轉做到這一點,只是谷歌一些示例 –

+0

[SQL Server數據透視表具有多列agg的可能重複regates](http://stackoverflow.com/questions/14694691/sql-server-pivot-table-with-multiple-column-aggregates) –

回答

0

如果沒有旋轉,您需要內部多次將表加入到表中,儘管您發佈的數據看起來像行數(部分)不是靜態的,這會使您再次回到Pivoting。

什麼,我建議你做的是操作一分爲二,其中第一條語句,你選擇哪一個將被轉換成列(與身份證後鏈接)行:

ID 
Parts sSourceCode 
Parts Division Name  
Sales Division Code 
Sales Division Name  
Sales Business Unit Code  
Sales Business Unit Name 

而且使用樞軸上的數據,然後內加入再將此數據與同桌得到

SELECT DISTINCT Location ID Location Code Location Name Division Code 
From Table 
Inner join PreviousData 
0

我想我們可以用CROSS/OUTER APPLY與FOR XML基於位置ID多行轉換成單排/地點代碼。

以下是生成的最終查詢和臨時表以測試結果。

創建表並填充一些記錄

CREATE TABLE TempLocations 
(
    LocationID INT, 
    LocationCode VARCHAR(20), 
    LocationName VARCHAR(30), 
    DivisionCode VARCHAR(100), 
    SourceCode VARCHAR(100), 
    DivisionName VARCHAR(100), 
    BusinessUnitCode VARCHAR(100), 
    BusinessUnitName VARCHAR(100) 

) 

INSERT INTO TempLocations 
VALUES 
(83806, 'D4009','Vanier Mitsubishi Fuso', 'SALES_01', 'SALES_01' ,'Sales_01', 'SALES DEPARTMENT', 'Fuso Vehicle Sales Department'), 
(83806, 'D4009', 'Vanier Mitsubishi Fuso', 'Parts_A0', 'Parts_A0', 'Parts District A0', 'PARTS DEPARTMENT', 'Fuso Parts Department'), 
(83806, 'D4009', 'Vanier Mitsubishi Fuso', 'SERVICE_C1', 'SERVICE_C1', 'Service Division C1', 'SERVICE DEPARTMENT', 'Fuso Service Department'), 
(83807, 'D4008','Borusia', 'SALES_01', 'SALES_01' ,'Sales_01', 'SALES DEPARTMENT', 'Borusia Sales Department'), 
(83807, 'D4008', 'Borusia', 'Parts_A0', 'Parts_A0', 'Parts District A0', 'PARTS DEPARTMENT', 'Borusia Parts Department'), 
(83807, 'D4008', 'Borusia', 'SERVICE_C1', 'SERVICE_C1', 'Service Division C1', 'SERVICE DEPARTMENT', 'Borusia Service Department') 

最終查詢得到的數據位置

SELECT 
DISTINCT 
    T.LocationID, 
    T.LocationCode, 
    T.LocationName, 
    TDIV.DivisionCode, 
    TS.SourceCode, 
    TDIVName.DivisionName, 
    TB.BusinessUnitCode, 
    TBName.BusinessUnitName 
FROM TempLocations AS T 
CROSS APPLY 
(
SELECT 
Stuff(
     (
      SELECT DISTINCT N', ' + DivisionCode 
      FROM TempLocations AS TDIV 
      WHERE TDIV.LocationID=T.LocationID FOR XML PATH(''),TYPE 
     ) 
    .value('text()[1]','nvarchar(max)'),1,2,N'' 
    ) AS DivisionCode 
) AS TDIV 
CROSS APPLY 
(
SELECT 
Stuff(
     (
      SELECT DISTINCT N', ' + SourceCode 
      FROM TempLocations AS TDIV 
      WHERE TDIV.LocationID=T.LocationID FOR XML PATH(''),TYPE 
     ) 
    .value('text()[1]','nvarchar(max)'),1,2,N'' 
    ) AS SourceCode 
) AS TS 
CROSS APPLY 
(
SELECT 
Stuff(
     (
      SELECT DISTINCT N', ' + DivisionName 
      FROM TempLocations AS TDIV 
      WHERE TDIV.LocationID=T.LocationID FOR XML PATH(''),TYPE 
     ) 
    .value('text()[1]','nvarchar(max)'),1,2,N'' 
    ) AS DivisionName 
) AS TDIVName 
CROSS APPLY 
(
SELECT 
Stuff(
     (
      SELECT DISTINCT N', ' + BusinessUnitCode 
      FROM TempLocations AS TDIV 
      WHERE TDIV.LocationID=T.LocationID FOR XML PATH(''),TYPE 
     ) 
    .value('text()[1]','nvarchar(max)'),1,2,N'' 
    ) AS BusinessUnitCode 
) AS TB 
CROSS APPLY 
(
SELECT 
Stuff(
     (
      SELECT DISTINCT N', ' + BusinessUnitName 
      FROM TempLocations AS TDIV 
      WHERE TDIV.LocationID=T.LocationID FOR XML PATH(''),TYPE 
     ) 
    .value('text()[1]','nvarchar(max)'),1,2,N'' 
    ) AS BusinessUnitName 
) AS TBName 

-- Drop table 
DROP TABLE TempLocations