2012-02-26 53 views
1

假设有一个SQL表是这样的:SQL查询来把人具有相同的姓氏和地址到一行

Label Name | Last name | Address Line 1 | Address line 2 
-----------+-----------+----------------+------------------- 
John  | Smith  | 100 Any St  | Anytown, WI, 50000 
Jane  | Smith  | 100 Any St  | Anytown, WI, 50000 
Bill  | Doe  | 200 Any St  | Anytown, WI, 50000 
Sam  | Rodgers | 200 Any St  | Anytown, WI, 50000 
Lisa  | Thompson | 300 Any St  | Anytown, WI, 50000 
Walter  | Thompson | 300 Any St  | Anytown, WI, 50000 
Chuck  | Thompson | 300 Any St  | Anytown, WI, 50000 

什么SQL查询会产生一个表像这样?:

Label Name    | Last name | Address Line 1 | Address line 2 
------------------------+-----------+----------------+------------------- 
John and Jane   | Smith  | 100 Any St  | Anytown, WI, 50000 
Bill     | Doe  | 200 Any St  | Anytown, WI, 50000 
Sam      | Rodgers | 200 Any St  | Anytown, WI, 50000 
Lisa, Walter, and Chuck | Thompson | 300 Any St  | Anytown, WI, 50000 
+3

您正在使用哪些DBMS? – 2012-02-26 02:29:51

+0

以及@BrankoDimitrijevic已经提到它可能会使用一些数据库特定的函数,比如说在mysql中使用'group_concat',但我们需要知道你正在使用哪个数据库,否则它将是一个自我连接的表格因为我得到了它+这个group_concat为选定的领域。这应该做到这一点。 – 2012-02-26 02:59:46

+0

@Solracnapod [没有这样的东西](http://en.wikipedia.org/wiki/Ms_sql_server#History)为“MS SQL Server ** 2010 **”。你实际使用哪个版本? – 2012-02-26 14:41:56

回答

2

您应该在表示层中执行这些操作,而不是在DBMS中。

但如果你真的想在DBMS层面要做到这一点,你的DBMS是MS SQL服务器(如您的评论似乎表明),你可以做到以下几点:

首先,创建一个功能(使用 '' 和 '和' 作为分隔符),该相关串接[Label Name]值:

CREATE FUNCTION CombineNames (
    @LastName nvarchar(max), 
    @AddressLine1 nvarchar(max), 
    @AddressLine2 nvarchar(max) 
) 
RETURNS nvarchar(max) AS 
BEGIN 

    DECLARE @NameCount INT; 

    SELECT @NameCount = COUNT(*) 
    FROM YOUR_TABLE 
    WHERE 
     [Last name] = @LastName 
     AND [Address Line 1] = @AddressLine1 
     AND [Address line 2] = @AddressLine2; 

    DECLARE @List nvarchar(max); 

    SELECT 
     @List 
      = COALESCE(@List, '') 
      + (
       CASE ROW_NUMBER() OVER(ORDER BY [Label Name]) 
       WHEN 1 THEN '' 
       WHEN @NameCount THEN ' and ' 
       ELSE ', ' 
       END 
      ) 
      + CAST([Label Name] as nvarchar(max)) 
    FROM YOUR_TABLE 
    WHERE 
     [Last name] = @LastName 
     AND [Address Line 1] = @AddressLine1 
     AND [Address line 2] = @AddressLine2 
    ORDER BY 
     [Label Name]; 

    RETURN (SELECT @List) 

END 

然后使用这样的功能:

SELECT 
    dbo.CombineNames([Last name], [Address Line 1], [Address Line 2]), 
    T.* 
FROM 
    (
     SELECT DISTINCT [Last name], [Address Line 1], [Address Line 2] 
     FROM YOUR_TABLE 
    ) T 

结果:

(No column name)  Last name  Address Line 1  Address Line 2 
----------------  ---------  --------------  -------------- 
Bill     Doe    200 Any St   Anytown, WI, 50000 
Sam      Rodgers   200 Any St   Anytown, WI, 50000 
Jane and John   Smith   100 Any St   Anytown, WI, 50000 
Chuck, Lisa and Walter Thompson  300 Any St   Anytown, WI, 50000 
1

无,这不是SQL的工作原理。您需要对SQL或其他语言进行迭代来对条目进行分组。你可以得到最近的事情是:

John | Smith | 100 Any St | Anytown, WI, 50000 
Jane | Smith | 100 Any St | Anytown, WI, 50000 

而且

Bill | Doe | 200 Any St | Anytown, WI, 50000 
Sam | Rodgers | 200 Any St | Anytown, WI, 50000 

而且

Lisa | Thompson | 300 Any St | Anytown, WI, 50000 
Walter | Thompson | 300 Any St | Anytown, WI, 50000 
Chuck | Thompson | 300 Any St | Anytown, WI, 50000 

你可以得到一个简单的GROUP BY语句

注意你如何建立一个声明:

SELECT field1, field2, field3 FROM table WHERE field2 = requirement; 
     ^ ^ ^
      1  2  3 

你会得到的字段数量是固定的,在这种情况下,3.你无法做任何事情来使它有时成为4或有时是5.唯一的变量将是你得到的记录数,但是他们输出的格式是固定的,并由你所做的查询来决定。

相关问题