2014-12-03 48 views
0

在SQL Server 2012中,我有一个看起来像四个表:拼合SQL 4个表

Issues

IssueID | IssueTitle 
1  | Light Bulb Burnt Out 
2  | Thermostat not working 

LocationTypes

TypeID | Type 
1  | Building 
2  | Floor 
3  | Room 

Locations

LocaltionID | TypeID | Location  | ParentLocation 
0   | 1  | default  | 0 
1   | 1  | Sears Tower | 0 
2   | 1  | IDS   | 0 
3   | 2  | Floor 1  | 1 
4   | 2  | Floor 2  | 1 
5   | 2  | Floor 3  | 1 
6   | 2  | Floor 4  | 1 
7   | 2  | Floor 5  | 1 
8   | 2  | Floor 6  | 1 
9   | 2  | Floor 7  | 1 
10   | 2  | Floor 8  | 1 
108   | 3  | Room 101  | 3 
109   | 3  | Room 102  | 3 
110   | 3  | Room 110  | 3 
111   | 3  | Room 202  | 4 
112   | 3  | Room 300  | 5 
175   | 2  | 1st Floor  | 2 
185   | 2  | 2nd Floor  | 2 
186   | 3  | Suite 295  | 185 

IssueLocations

IssueID | LocationId 
1  | 1   
1  | 5   
1  | 112 
2  | 2 
2  | 185 

而我想要做的就是结合表,这样我结束了一行每间发行机构,与字段名称为列标题和字段值,所以我结束了:

结果:

IssueID | IssueTitle    | Building  | Floor  | Room 
-------------------------------------------------------------------------- 
1  | Light Bulb Burnt Out | Sears Tower | Floor 1 | Room 300 
2  | Thermostat not working | IDS   | 2nd Floor | 

注意的第二个问题没有一个房(无位置为必填项),位置少的问题是有效的。请注意,其他约束可能导致所需的位置,但我认为这与此问题无关。

+2

向我们展示你的尝试和努力,到目前为止 - 并告诉我们你就完蛋了! – 2014-12-03 17:26:07

+0

我想你在'IssueLocations'表中缺少'TypeID'。 – 2014-12-03 17:27:25

+0

@ Dave.Gugg问题 - > IssueLocations - >位置 - >位置类型 – brykneval 2014-12-03 17:29:44

回答

2

您需要使用Pivot转置您的行为列。

SQL FIDDLE DEMO

SELECT * 
FROM (SELECT il.IssueID, 
       l.Location, 
       i.IssueTitle, 
       lt.Type 
     FROM Locations l 
       JOIN LocationTypes lt 
       ON l.TypeID = lt.TypeID 
       JOIN IssueLocations il 
       ON il.LocationId = l.LocaltionID 
       JOIN issues i 
       ON i.IssueID = il.IssueID) a 
     PIVOT (Max(location) 
      FOR type IN([Building], 
         [Floor], 
         [Room]))piv 
+0

可能会有更多或更少的位置类型。没有列的硬编码。 – 2014-12-03 19:12:32