Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何合并来自不同行的数据?_Sql Server_Sql Server 2012 - Fatal编程技术网

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

我继续用服务器版本编辑我的文章。超前/滞后听起来很有趣,但我对它了解不够,也不确定它是否能帮助我实现我想要的结果。我几乎想知道我是否应该给所有相关的列分配数字,然后做一个案例陈述。我继续用服务器版本编辑我的文章。超前/滞后听起来很有趣,但我对它了解不够,也不确定它是否能帮助我实现我想要的结果。我几乎想知道我是否应该为所有相关的列分配数字,然后对其进行案例说明。