2016-07-19 2 views
2

교회 회원들의 큰 목록을 처리하여 편지를 보내고 있습니다. 우리는 편지에 "친애하는 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 | 
+-----------+------------+--------------------------+ 

그러나 가족 구성원이 하나만있을 때 문제가 발생합니다.

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 또는 무언가를 사용하여 행을 결합해야한다고 생각하지만, 내가하는 열 지정의 방법이 필요 거라고 그렇게 먼저 : 여기

내가 가진 쿼리의 일부 남자 이름이 항상 먼저 나온다. 본질적으로 위에 언급 한 바와 같이 나는 한 사람이있는 가족을 위해 "Dear John & Jane Smith"와 두 사람이있는 가족을 위해 "Dear John Smith"라는 편지가 필요합니다. 그래서 나는 것처럼 보일 수 있습니다 내 결과를 기대하고있다 :

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

답변

3

처럼 사용할 수 있습니다.

Here is an example with your data

select 
id 
, coalesce(male_name+' & '+female_name,male_name, female_name) 
, last_name 
from F; 
당신은 당신이 널 얻을 것이다는 SQL Server의 +를 사용 널링 기본적으로 경우 : 테이블에서

당신은 사용을 지적했다. 남성 또는 여성 이름이 NULL 인 경우 NULL이됩니다. Coalesce는 NULL을 볼 경우 다음 값으로 이동합니다. 이 방법을 사용하면 '&' 또는 각 가족에 대해 하나의 이름으로 쌍을 얻을 수 있습니다.

+0

완벽한! 이것은 내가 필요로했던 것과 똑같다. 나는 임시 테이블이나 뭔가가 필요할 것이라고 생각했지만, '+'그리고 각 컬럼을 다시 사용하는 것을 생각하지 않았습니다. 다음은 임시 테이블에 대한 쿼리의 결과입니다. SELECT 병합 (ml.male + '&'+ ml.female, male, female) AS '이름', ml. [성], ml . 스트리트, ml.City, ml.State, ml. [우편 번호] 발신 번호 : DROP TABLE # ML' –

-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

이것은 이름을 결합하는 데 사용되지만 한 사람이있는 가족의 이름 필드에는 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