指定哪个列在SQL的前面
我正在处理一份教会成员的大名单,以便给他们写信。我们希望信上写着“亲爱的约翰和简·史密斯”。我们将使用Word从Excel工作表进行邮件合并。重要的是男性的名字必须总是排在第一位 在我使用的表中,每个人都有自己的行。它们有一个唯一的ID和一个族ID。我正在使用该族ID将族放在同一行中。目前,我使用指定哪个列在SQL的前面,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在处理一份教会成员的大名单,以便给他们写信。我们希望信上写着“亲爱的约翰和简·史密斯”。我们将使用Word从Excel工作表进行邮件合并。重要的是男性的名字必须总是排在第一位 在我使用的表中,每个人都有自己的行。它们有一个唯一的ID和一个族ID。我正在使用该族ID将族放在同一行中。目前,我使用MAX(CASE-WHEN)将男性姓名和女性姓名分开,以指定要放在哪里。它看起来像这样: +-----------+------------+--------------------------+ |
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 |
+-----------+--------------+-----------+
你可以这样用
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
您可以使用中间表(假设一个族id没有3个名称) 从您指定使用的表格中:
select
id
, coalesce(male_name+' & '+female_name,male_name, female_name)
, last_name
from F;
基本上,如果在Sql Server中使用
+
进行连接,将得到null。因此,如果男性或女性的名字是NULL
,那么您将得到NULL
。如果Coalesce看到NULL
,它将移动到下一个值。通过这种方式,您可以获得一对带有“&”
,或者每个族有一个单独的名称。我已经创建了一些测试数据。这项技术适用于测试数据
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
这适用于合并姓名,但对于只有一个人的家庭,我在名字字段中的值为空。太好了!这正是我所需要的。我想我需要一个临时表或什么的,但我没有想到使用“+”然后再使用每一列。以下是对临时表的查询结果:
从#ml-ml-ml-DROP-table#ml中选择coalesce(ml.male+'&+ml.female,male,female)作为'First Name',ml.[姓氏],ml.Street,ml.City,ml.State,ml.[邮政编码]