2016-07-19 4 views
2

教会員の手紙を送るために教会員の大きなリストを処理しています。手紙に「Dear John & Jane Smith」と挨拶してほしい。 Wordを使用してExcelシートから差し込み印刷を行います。重要なのは、男性の名前が常に最初に来なければならないということです。最初に来る列を指定する

各個人は、私が使用しているテーブルに自分の行があります。彼らは一意のIDと家族のIDを持っています。私はその家族IDを使用して、同じ列に家族をまとめています。現在、どこに行くのかを指定するために、男性名と女性名をMAX(CASE WHEN)で区切っています。これは次のようになります。

+-----------+------------+--------------------------+ 
| family id | male name | female name | last name | 
+-----------+------------+--------------------------+ 
|  1234 | john  | jane  | doe  | 
|  1235 | bob  | cindy  | smith  | 
|  1236 | NULL  | susan  | jones  | 
|  1237 | jim  | NULL  | taylor | 
+-----------+------------+--------------------------+ 

しかし、家族にメンバーが1人しかいない場合は、問題が発生します。ここで

は、私が持っているクエリの一部です:

SELECT 
fm.family_id AS 'Family ID', 
MAX(CASE WHEN PB.gender like 'm' and FM.role_luid=29 THEN PB.nick_name END) 
AS 'Male Name', 
MAX(CASE WHEN PB.gender like 'f' and FM.role_luid=29 THEN PB.nick_name END) 
AS 'Female Name', 
PB.last_name AS 'Last Name', 

FROM core_family F 

私はSTUFFまたはそのような何かを使用して行を結合する必要があると考えていたが、私はそう最初に来るどの列指定のいくつかの方法が必要と思い男性の名前が常に最初に来ること。基本的には、上記のように、私は、1人の家族のための2人の家族と "親愛なるジョンスミス"の家族のために "Dear John & Jane Smith"と読むための手紙が必要です。

+-----------+--------------+-----------+ 
| family id | First name | last name | 
+-----------+--------------+-----------+ 
|  1234 | john & jane | doe  | 
|  1235 | bob & cindy | smith  | 
|  1236 | susan  | jones  | 
|  1237 | jim   | taylor | 
+-----------+--------------+-----------+ 

答えて

3

のように使用することができます。だから私は、私の結果は次のようになります期待しています。表から

あなたは指示された使用:

select 
id 
, coalesce(male_name+' & '+female_name,male_name, female_name) 
, last_name 
from F; 

Here is an example with your data

は、SQL Serverの+を使用して連結する場合は基本的に、あなたがnullを取得します。したがって、男性または女性の名前がNULLの場合、NULLとなります。合体は、NULLが見える場合、次の値に移動します。このようにして、'&'のペアまたは各ファミリーの単一の名前を取得します。

+0

パーフェクト!これはまさに私が必要としたことでした。私は一時テーブルなどが必要だと思っていましたが、「+」をクリックしてから各列を再度使用することは考えていませんでした。ここでは、テンポラリテーブルのクエリが次のようになっていました。 ' '、' [郵便番号] FROM #MLmL DROP TABLE#ML' [XXXX] –

-1

あなたは(あなたが家族のIDの3名を持っていないと仮定して)あなたの中間テーブルを使用することができ、この

SELECT         
fm.family_id AS 'Family ID', 
    MAX(CASE WHEN PB.gender like 'm' and FM.role_luid=29 THEN PB.nick_name END) 
+ '&'+  
MAX(CASE WHEN PB.gender like 'f' and FM.role_luid=29 THEN PB.nick_name END) 
AS 'First Name', 
    PB.last_name AS 'Last Name', 
    FROM core_family F 
+0

これは名前を結合するために機能しますが、1人の家族の名前フィールドにはNULLが表示されます。 –

0

私はいくつかのテストデータを作成しました。このテクニックは、テストデータで機能します。

CREATE TABLE #Temp (FamID INT, 
         MaleName VARCHAR(20), 
         FemaleName VARCHAR(20), 
         LName VARCHAR(20)) 

INSERT #Temp 
VALUES (1234, 'John' ,'Jane' , 'Doe'), 
     (1235, 'Bob' , 'Cindy' , 'Smith'), 
     (1236 , NULL , 'Susan' , 'Jones'), 
     (1237 , 'Jim' , NULL , 'Taylor') 

ここにあなたの質問があります。

SELECT FamID, 
     ISNULL(MaleName+' ','') + 
      CASE WHEN MaleName IS NULL OR FemaleName IS NULL THEN '' ELSE 'and ' END+ 
     ISNULL(FemaleName,'') AS FirstName, 
    LName 
FROM #Temp 
関連する問題