指定哪个列首先是SQL

时间:2016-07-19 17:49:15

标签: sql sql-server sql-server-2008

我正在处理一大堆教会成员,以便给他们发一封信。我们希望这封信能说“亲爱的约翰和简史密斯”。我们将使用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    |
+-----------+--------------+-----------+

3 个答案:

答案 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