我正在处理一大堆教会成员,以便给他们发一封信。我们希望这封信能说“亲爱的约翰和简史密斯”。我们将使用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
或类似的东西来组合行,但是我需要某种方法来指定哪个列首先出现,以便男性名字始终排在第一位。基本上,如上所述,对于有两个人的家庭,我需要这封信为“亲爱的约翰和简史密斯”,对于有一个人的家庭,我需要“亲爱的约翰史密斯”。所以我希望我的结果看起来像:
+-----------+--------------+-----------+
| family id | First name | last name |
+-----------+--------------+-----------+
| 1234 | john & jane | doe |
| 1235 | bob & cindy | smith |
| 1236 | susan | jones |
| 1237 | jim | taylor |
+-----------+--------------+-----------+
答案 0 :(得分:3)
您可以使用中间表(假设您没有家庭ID的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
,Coalesce将转到下一个值。通过这种方式,您可以获得一对'&'
或每个家庭的单一名称。
答案 1 :(得分:0)
我已经创建了一些测试数据。这种技术适用于测试数据。
% mvn --version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T10:41:47-06:00)
Maven home: /usr/local/Cellar/maven/3.3.9/libexec
Java version: 1.7.0_75, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.11.5", arch: "x86_64", family: "mac"
这是您的查询。
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')
答案 2 :(得分:-1)
你可以这样使用
self