SQL 具有多个值的数据透视表
SQL Pivot with multiple values
你好,我有一个 table 像这样:
Building Categories Properties
-----------------------------------------
Building250 Structure Steel
Building250 Security Access Card
Building250 Security Security Guard
Building250 Security Fire Alarm System
Building250 Security Sprinklered
Building250 Security Smoke or heat detectors
Building46 Structure Brick
Building46 Structure Steel
Building46 Walls Steel Stud
Building46 Walls Masonry
Building46 Washroom OwnSpace
Building46 Washroom Common
Building46 Security Access Card
Building46 Security Burglar Alarm
我需要像这样转动它:
Building Structure Security Walls Washroom
----------------------------------------------------------------------------
Building250 Steel Access Card
Security Guard
Fire Alarm System
Sprinklered
heat detectors
Building46 Brick Access Card Steel Stud OwnSpace
Steel Burglar Alarm Masonry Common
Sprinklered
我尝试了 SQL Pivot,但由于它需要聚合,因此它 returns 对于给定的类别只有 1 属性。还有别的办法吗?
这是我的枢轴 SQL:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Category)
FROM Buildings
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT Building, ' + @cols + ' from
(
SELECT Building, Category, Property, from Buildings
) x
pivot
(
min(Property)
for Category in (' + @cols + ')
) p '
execute(@query)
正如您所指出的,Pivot 可以进行聚合,虽然有可能的变通方法,但您可以在没有 Pivot 的情况下使用如下所示的方法完成所需的操作。您还可以使用与创建动态枢轴相同的方法使其动态化。
Select B.Building, Str.Properties Structure,
Sec.Properties Security, Walls.Properties Walls, Wash.Properties Washroom
From (Select Distinct Building From Table) B
Left Join Table Str On Str.Building = B.Building And Categories = 'Structure'
Left Join Table Sec On Sec.Building = B.Building And Categories = 'Security'
Left Join Table Walls On Walls.Building = B.Building And Categories = 'Walls'
Left Join Table Wash On Wash.Building = B.Building And Categories = 'Washroom'
你好,我有一个 table 像这样:
Building Categories Properties
-----------------------------------------
Building250 Structure Steel
Building250 Security Access Card
Building250 Security Security Guard
Building250 Security Fire Alarm System
Building250 Security Sprinklered
Building250 Security Smoke or heat detectors
Building46 Structure Brick
Building46 Structure Steel
Building46 Walls Steel Stud
Building46 Walls Masonry
Building46 Washroom OwnSpace
Building46 Washroom Common
Building46 Security Access Card
Building46 Security Burglar Alarm
我需要像这样转动它:
Building Structure Security Walls Washroom
----------------------------------------------------------------------------
Building250 Steel Access Card
Security Guard
Fire Alarm System
Sprinklered
heat detectors
Building46 Brick Access Card Steel Stud OwnSpace
Steel Burglar Alarm Masonry Common
Sprinklered
我尝试了 SQL Pivot,但由于它需要聚合,因此它 returns 对于给定的类别只有 1 属性。还有别的办法吗?
这是我的枢轴 SQL:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Category)
FROM Buildings
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT Building, ' + @cols + ' from
(
SELECT Building, Category, Property, from Buildings
) x
pivot
(
min(Property)
for Category in (' + @cols + ')
) p '
execute(@query)
正如您所指出的,Pivot 可以进行聚合,虽然有可能的变通方法,但您可以在没有 Pivot 的情况下使用如下所示的方法完成所需的操作。您还可以使用与创建动态枢轴相同的方法使其动态化。
Select B.Building, Str.Properties Structure,
Sec.Properties Security, Walls.Properties Walls, Wash.Properties Washroom
From (Select Distinct Building From Table) B
Left Join Table Str On Str.Building = B.Building And Categories = 'Structure'
Left Join Table Sec On Sec.Building = B.Building And Categories = 'Security'
Left Join Table Walls On Walls.Building = B.Building And Categories = 'Walls'
Left Join Table Wash On Wash.Building = B.Building And Categories = 'Washroom'