Fra*_*ley 0 join sql-server pivot
我有一个视图,我在其中提取车辆的属性,例如轮胎尺寸、发动机容量、颜色、门数等。这些数据存储在多个表中,但我已将数据简化到我的视图中。
我想要实现的是将此视图加入我的主车辆表,以便我可以选择各种属性作为单行中的列。
我的看法:
Vehicle_ID Property Value
1 Doors 2
1 Engine Size 2 liter
1 Tire Size 50cm
1 Color Blue
2 Doors 4
2 Engine Size 3 liter
Run Code Online (Sandbox Code Playgroud)
还有我的主要车辆表:
Vehicle_ID Description Date_Bought Owner_ID
1 BMW M3 Sport 2000/12/23 1
2 Audi A5 3XL 2015/03/19 1
Run Code Online (Sandbox Code Playgroud)
所以我想出去的是
Vehicle ID Description Date_Bought Doors [Engine Size] [Tire Size] [Color]
1 BMW M3 Sport 2000/12/23 2 2 liter 50cm Blue
Run Code Online (Sandbox Code Playgroud)
我的整体 SQL 知识相当有限,我很擅长 JOINS 和其他东西,但是 PIVOT 命令的逻辑及其语法完全让我望而却步。
使用 PIVOT 子句,您可以获得如下结果:
SELECT
Vehicle_ID,
Doors,
[Engine Size],
[Tire Size],
[Color]
FROM
dbo.YourView
PIVOT
(
MAX(Value) FOR Property IN (Doors, [Engine Size], [Tire Size], [Color])
) AS p
;
Run Code Online (Sandbox Code Playgroud)
现在,要将结果连接到您的主车辆表,您可以使用上面的作为派生表(与您可能对自己找到的解决方案所做的相同) - 或者您可以将主表直接连接到 PIVOT 的结果:
SELECT
m.Vehicle_ID,
m.Description,
m.DateBought,
p.Doors,
p.[Engine Size],
p.[Tire Size],
p.[Color]
FROM
dbo.YourView
PIVOT
(
MAX(Value) FOR Property IN (Doors, [Engine Size], [Tire Size], [Color])
) AS p
INNER JOIN dbo.MainVehicleTable AS m ON p.Vehicle_ID = m.Vehicle_ID
;
Run Code Online (Sandbox Code Playgroud)
以上假设您的观点只有您的问题中提到的三列。如果有更多(例如记录/存储属性的时间或其他内容),那么您可能需要用dbo.YourView仅提取这三列的派生表替换普通引用:
...
FROM
(
SELECT
Vehicle_ID,
Property,
Value
FROM
dbo.YourView
) AS s
PIVOT
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19166 次 |
| 最近记录: |