Sql server 在SQL Server中将行转换为列

Sql server 在SQL Server中将行转换为列,sql-server,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

我有一个查询,返回如下结果:

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
我希望得到如下结果:

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,我只需要一行,其各自的零件/服务/销售部门/业务单元代码和名称显示在同一行中,作为单独的列…我不相信我可以使用数据透视,如果可能的话,有人能给我指出正确的方向,或者给我一些如何实现这一点的例子。

如果不进行数据透视,您需要多次将表内部连接到它本身,尽管从您发布的数据来看,行数(部分)似乎不是静态的,这使您再次回到数据透视

我建议您将操作拆分为两部分,其中第一条语句选择将转换为列的行(带有稍后链接的id):

并对该数据使用数据透视,然后再次将该数据与同一个表进行内部联接以获取

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

我认为我们可以使用CROSS/OUTER和FOR XML,根据位置ID/位置代码将多行转换为单行

下面是为测试结果而生成的最终查询和临时表

创建表并填充一些记录

获取位置数据的最终查询


是的,你可以通过旋转来实现,比如谷歌,它可能是
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