如何合并来自不同行的数据?

时间:2016-11-28 22:11:55

标签: sql-server sql-server-2012

我不知道如何清楚地陈述我的问题,但我会尽力使用这个例子:

我有一张目前的表格:

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

我的目标是让它看起来像这样:

{{1}}

我过去曾使用过CASE语句填写列数据,但是这个请求让我感到有点难过,因为它依赖于将RIGHT([Request],3)从表格与[No.]列相匹配,然后根据MERGE TO [编号]填充列。我有更多的专栏来填充,但认为这是我能说明问题的最简单方法。

使用MSSQL。每列都是VARCHAR(50)。

2 个答案:

答案 0 :(得分:2)

CASE会起作用,但COALESCE会更干净地达到相同的效果。我认为问题在于您需要首先将表连接到自身,并确保将第一个表上的Request字段连接到第二个字段的No.字段。以下是基于您的问题的示例:

before_script:
    - apt-get -qq update
    - npm set progress=false
    - npm install --silent

deploy:
    script:
    - npm run deploy
    - apt-get install -yqq ruby ruby-dev --silent
    - gem install dpl
    - dpl --provider=heroku --app=your-app-name --api-key=$HEROKU_API_KEY
    only:
    - master

这应该返回结果:

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

答案 1 :(得分:0)

根据您使用的版本,您可以使用LEAD或LAG来实现您的工作:

http://blog.sqlauthority.com/2011/11/15/sql-server-introduction-to-lead-and-lag-analytic-functions-introduced-in-sql-server-2012/

这些可以让您查看查询行之前和之后的行。

请使用您正在使用的SQL版本标记您的问题,这会对可能的答案产生影响。