我正在处理大量教会成员名单,以便给他们写信。我们希望这封信说“亲爱的约翰和简·史密斯”。我们将使用 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 |
+-----------+--------------+-----------+
最佳答案
您可以使用中间表(假设您的家庭 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
。如果 Coalesce 看到 NULL
,它将继续处理下一个值。这样,您可以为每个系列获得一对带有 '&'
的名称或单个名称。
关于sql - 指定哪一列在前 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38465258/