Sql server 如何合并来自不同行的数据?
我不知道如何清楚地陈述我的问题,但我会尽我所能用这个例子: 我有一个表,当前看起来像:Sql server 如何合并来自不同行的数据?,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我不知道如何清楚地陈述我的问题,但我会尽我所能用这个例子: 我有一个表,当前看起来像: ----------------------------------------------------- |No. | Name | Request | Sales Territory | ----------------------------------------------------- |001 | Account 1 | NULL | PNW
-----------------------------------------------------
|No. | Name | Request | Sales Territory |
-----------------------------------------------------
|001 | Account 1 | NULL | PNW |
-----------------------------------------------------
|002 | Account 2 | MERGE TO 001 | NULL |
-----------------------------------------------------
|011 | Account 5 | NULL | EUROPE |
-----------------------------------------------------
|500 | Account 8 | MERGE TO 011 | NULL |
-----------------------------------------------------
我的目标是让它看起来像这样:
-----------------------------------------------------
|No. | Name | Request | Sales Territory |
-----------------------------------------------------
|001 | Account 1 | NULL | PNW |
-----------------------------------------------------
|002 | Account 2 | MERGE TO 001 | PNW |
-----------------------------------------------------
|011 | Account 5 | NULL | EUROPE |
-----------------------------------------------------
|500 | Account 8 | MERGE TO 011 | EUROPE |
-----------------------------------------------------
过去我使用CASE语句来填充列数据,但这个请求让我有点困惑,因为它依赖于将表中的右([request],3)匹配到[No.]列,然后根据合并到[No.]来填充列。我有更多的列要填充,但我认为这是我能够说明我的问题的最简单的方法
使用MSSQL。每列都是VARCHAR(50)。根据您使用的版本,您可以使用超前或滞后来实现您的方法: 通过这些选项,可以查看查询行前后的行
请用您正在使用的SQL版本标记您的问题,这会影响可能的答案。根据您使用的版本,您可以使用LEAD或LAG来实现您的目的: 通过这些选项,可以查看查询行前后的行 请用您正在使用的SQL版本标记您的问题,这会影响可能的答案。案例会起作用,但会更清晰地实现相同的结果。我认为问题在于,您需要首先将表连接到自身,并确保将第一个表上的Request字段连接到第二个字段的No.字段。以下是一个基于您的问题的示例:
CREATE TABLE #tmpAccount (
[No.] VARCHAR(50)
,Name VARCHAR(50)
,Request VARCHAR(50)
,[Sales Territory] VARCHAR(50)
)
INSERT INTO #tmpAccount
VALUES ('001', 'Account 1', NULL, 'PNW')
,('002', 'Account 2', 'MERGE TO 001', NULL)
,('011', 'Account 5', NULL, 'EUROPE')
,('500', 'Account 8', 'MERGE TO 011', NULL)
SELECT tmp1.[No.]
,tmp1.Name
,tmp1.Request
,COALESCE(tmp2.[Sales Territory], tmp1.[Sales Territory]) AS [Sales Territory]
FROM #tmpAccount tmp1
left join
#tmpAccount tmp2 on RIGHT(tmp1.Request, 3) = tmp2.[No.]
DROP TABLE #tmpAccount
这将返回以下结果:
|No. |Name |Request |Sales Territory
|001 |Account 1 |NULL |PNW
|002 |Account 2 |MERGE TO 001 |PNW
|011 |Account 5 |NULL |EUROPE
|500 |Account 8 |MERGE TO 011 |EUROPE
这个案例会起作用,但会更干净地达到同样的效果。我认为问题在于,您需要首先将表连接到自身,并确保将第一个表上的Request字段连接到第二个字段的No.字段。以下是一个基于您的问题的示例:
CREATE TABLE #tmpAccount (
[No.] VARCHAR(50)
,Name VARCHAR(50)
,Request VARCHAR(50)
,[Sales Territory] VARCHAR(50)
)
INSERT INTO #tmpAccount
VALUES ('001', 'Account 1', NULL, 'PNW')
,('002', 'Account 2', 'MERGE TO 001', NULL)
,('011', 'Account 5', NULL, 'EUROPE')
,('500', 'Account 8', 'MERGE TO 011', NULL)
SELECT tmp1.[No.]
,tmp1.Name
,tmp1.Request
,COALESCE(tmp2.[Sales Territory], tmp1.[Sales Territory]) AS [Sales Territory]
FROM #tmpAccount tmp1
left join
#tmpAccount tmp2 on RIGHT(tmp1.Request, 3) = tmp2.[No.]
DROP TABLE #tmpAccount
这将返回以下结果:
|No. |Name |Request |Sales Territory
|001 |Account 1 |NULL |PNW
|002 |Account 2 |MERGE TO 001 |PNW
|011 |Account 5 |NULL |EUROPE
|500 |Account 8 |MERGE TO 011 |EUROPE
我继续用服务器版本编辑我的文章。超前/滞后听起来很有趣,但我对它了解不够,也不确定它是否能帮助我实现我想要的结果。我几乎想知道我是否应该给所有相关的列分配数字,然后做一个案例陈述。我继续用服务器版本编辑我的文章。超前/滞后听起来很有趣,但我对它了解不够,也不确定它是否能帮助我实现我想要的结果。我几乎想知道我是否应该为所有相关的列分配数字,然后对其进行案例说明。