在SQL

时间:2018-08-01 14:14:50

标签: sql sql-server group-by inner-join

我想将数据从一个sql数据库导入到另一个。包含数据的数据库的结构与我现在拥有的数据库不同。

我的数据库具有表Person和Person_Data

人员专栏:

id(PK, int) | Person_Name(text)| Person_Data_id(FK, int)

Person_Data列:

Person_Data_id(PK, int) | Date_Of_Birth(text)| City_Of_Birth(text) | Favorite_City(text)|

另一个数据库具有必要的数据来填充此数据,但是结构有所不同。它具有这些表: ExternalPerson,ExternalProperty

ExternalPerson列:

|PersonID(PK, int)  | Name(string)  |

|   0               |"John"         |
|   1               |"Bob"          |

ExternalProperty列:

|PersonId|PropertyName|PropertyAttribute|PropertyValue|

|   0    |"Birth"     | "City"          |"Rome"       |
|   1    |"Birth"     | "City"          |"Vienna"     |
|   0    |"Birth"     | "Date"          |"1982-02-01" |
|   0    |"Favorite"  | "City"          |"New York"   |

如您所见,外部数据库包含可以插入常规数据库中的信息。只是某些列存储在行中。我想将其合并,以便对于每个PersonID,我们选择“出生和城市”的值,并将其放入City_Of_Birth等中。外部数据库的结构使得PersonID,PropertName和PropertyAttribute的每个组合只有一行,因此没有歧义的风险。外部数据库中存在的PropertyName和PropertyAttribute的所有组合在Person_Data表中也具有相应的列。尽管可能缺少数据,例如,在我们的示例中,Bob没有出生日期或“最爱城市”的值,在这种情况下,这些条目应为空。也就是说,我想将两个表ExternalPerson和ExternalProperty转换为

|id(PK, int)|Name  |Date_Of_Birth|City_Of_Birth|Favorite_City|

|auto       |"John"|"1982-02-01" |"Rome"       |"New York"   |
|increment  |"Bob" |    NULL     |"Vienna"     |NULL         |

我尝试了JOIN,GROUP BY,SELECT CASE WHEN和COALESCE的各种组合都无济于事。我觉得应该可以这样做,但是还没有成功找到将外部数据库中的行提取到列中的SQL命令。例如,线

SELECT 
    Name, 
    PropertValue AS City_Of_Birth
FROM 
    ExternalProperty

WHERE PropertyName LIKE 'Birth' AND PropertyAttribute LIKE 'City'

将在同一列中与City一起输出City_Of_Birth,但我不知道如何汇总结果。 是否有人对此有任何想法?预先感谢。

我正在使用Microsoft SQL Server Management Studio 2017和Microsoft SQL Server 2017(RTM)-14.0.1000.169(X64)

1 个答案:

答案 0 :(得分:1)

您可以使用MAX()进行聚合

MAX(CASE WHEN PropertyName LIKE 'Birth' AND PropertyAttribute LIKE 'City' THEN PropertyValue ELSE NULL END) AS City_Of_Birth