我想我們可以用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
是的,你可以用旋轉做到這一點,只是谷歌一些示例 –
[SQL Server數據透視表具有多列agg的可能重複regates](http://stackoverflow.com/questions/14694691/sql-server-pivot-table-with-multiple-column-aggregates) –