指定哪个列在SQL的前面

指定哪个列在SQL的前面,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在处理一份教会成员的大名单,以便给他们写信。我们希望信上写着“亲爱的约翰和简·史密斯”。我们将使用Word从Excel工作表进行邮件合并。重要的是男性的名字必须总是排在第一位 在我使用的表中,每个人都有自己的行。它们有一个唯一的ID和一个族ID。我正在使用该族ID将族放在同一行中。目前,我使用MAX(CASE-WHEN)将男性姓名和女性姓名分开,以指定要放在哪里。它看起来像这样: +-----------+------------+--------------------------+ |

我正在处理一份教会成员的大名单,以便给他们写信。我们希望信上写着“亲爱的约翰和简·史密斯”。我们将使用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    |
+-----------+--------------+-----------+
你可以这样用

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.[邮政编码]