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