1列上的组并合并行

时间:2013-05-16 08:23:41

标签: sql sql-server-2005

我有SQL表,看起来像这样

姓名|领域|价值|


约翰|国家|美国|
约翰|城市|纽约|
约翰|街|第五大道|
迈克|国家|英国|
迈克|城市|伦敦|
迈克|街| Surrey steet |
蒂姆|国家|加拿大|
蒂姆|城市|蒙特利尔|

我需要的是根据Name对它进行分组并合并成行(每个名称1行),如下所示

|名称|国家|城市|街|


|约翰|美国|纽约|第五大道|
|迈克|英国|伦敦|萨里街|
|蒂姆|加拿大|蒙特利尔|空|

有没有人知道如何实现这样的目标?

编辑:字段数是动态的。用户可以添加其他字段类型,例如GUI中的ZIP,它应该自动反映在查询中。

提前多多谢谢你! 彼得

1 个答案:

答案 0 :(得分:2)

SELECT  Name,
        MAX(CASE WHEN field = 'Country' THEN value END) Country,
        MAX(CASE WHEN field = 'City' THEN value END) City,
        MAX(CASE WHEN field = 'Street' THEN value END) Street
FROM    tableName
GROUP   BY Name

使用PIVOT函数

SELECT  Name, Country, City, Street
FROM    
        (
            SELECT  Name, Field, Value
            FROM    TableName
        ) data
        PIVOT
        (
            MAX(Value)
            FOR Field IN (Country, City, Street)
        ) pvt

输出

╔══════╦═════════╦══════════╦══════════════╗
║ NAME ║ COUNTRY ║   CITY   ║    STREET    ║
╠══════╬═════════╬══════════╬══════════════╣
║ John ║ USA     ║ New York ║ 5th avenue   ║
║ Mike ║ UK      ║ London   ║ Surrey steet ║
║ Tim  ║ Canada  ║ Montreal ║ (null)       ║
╚══════╩═════════╩══════════╩══════════════╝