如何将视图转为连接,以便将多个查询行作为单行中的列?

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 命令的逻辑及其语法完全让我望而却步。

And*_*y M 5

使用 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)