2012-02-26 7 views
1

に対処する:SQLクエリと同じ姓を持つ人々を入れて、このようなSQLテーブルがあったと仮定し1行に

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を使用していますか? –

+0

@BrankoDimitrijevicは、おそらくmysqlの 'group_concat'と言ったようないくつかのデータベース固有の関数を使用することで可能かもしれないと言いましたが、使用しているDBを再度知る必要があります。そうでなければ、選択したフィールドのgroup_concat +を取得しています。それはそれを行う必要があります。 –

+0

@Solracnapod [このようなことはありません](http://en.wikipedia.org/wiki/Ms_sql_server#History)を「MS SQL Server ** 2010 **」としています。あなたは実際にどのバージョンを使用していますか? –

答えて

2

DBMSではなく、プレゼンテーション層でこれらの種類の作業を行う必要があります。

しかし、あなたは次の操作を行うことができます(あなたのコメントが示しているようだとして)あなた本当には、DBMSレベルでこれをやってみたい、とあなたのDBMSは、MS SQL Serverのであれば:

まず、関数を作成

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 
すなわち関連 [Label Name]値( '' を使用し、 'と' セパレータとして)を連結します

結果:

(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とそれを得ることができ、あなたが構築する方法注ステートメント:

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

フィールドの数は固定されています(この場合は3)。時には4または時々5にすることはできません。唯一の変数は取得するレコードの数ですが、出力の形式は固定され、作成したクエリーによって決定されます。

関連する問題