2016-11-28 2 views
0

я не знаю, как четко сформулировать свой вопрос, но я сделаю все возможное в этом примере:Как объединить данные из разных строк?

У меня есть таблица, которая в настоящее время выглядит следующим образом:

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

Я использовал высказывание в прошлом для заполнения данных столбца, но этот запрос имеет меня немного озадачен, как это полагается на соответствие ПРАВОГО ([запрос], 3) из таблицу в столбец [№], а затем заполнение столбца на основе e MERGE TO [No.]. У меня больше столбцов для заполнения, но я понял, что это самый простой способ продемонстрировать мой вопрос.

Использование MSSQL. Каждый столбец VARCHAR (50).

ответ

2

CASE будет работать, но COALESCE достигнет такого же результата немного более чисто. Я думаю, что проблема заключается в том, что вам нужно сначала присоединиться к таблице и убедиться, что вы присоединяете поле «Запрос» в первой таблице к полю № второго поля. Вот пример, основанный на ваш вопрос:

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 
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, которую вы используете, это влияет на потенциальные ответы.

+0

Я пошел вперед и отредактированный мой пост с версией сервера. LEAD/LAG звучит интересно, но я этого недостаточно понимаю и не уверен, что это поможет мне достичь результатов, которые я хочу. Мне почти интересно, следует ли присваивать числа всем связанным столбцам, а затем делать оператор CASE. – CoffeeCoder

Смежные вопросы