Какой наилучший подход к взаимосвязи запроса и возврата?

#sql

#sql

Вопрос:

Я очень новичок в SQL, и мне нравится, как решить следующую проблему. Заранее спасибо!

У меня есть таблица с 2 столбцами, OldProductLineID и соответствующим ей NewProductLineID.

Как мне вернуть таблицу с 1 дополнительным столбцом (3-й столбец), чтобы показать взаимосвязь между идентификаторами PRODUCTLINEID

Пример данных

 OldID | NewID  
123   | 987  
234   | 987  
456   | 876  
456   | 877  
567   | 777
  

Результат, который мне нужен

 OldID | NewID | Relationship    
123   | 987   | Regroup  
234   | 987   | Regroup  
456   | 876   | Split  
456   | 877   | Split  
567   | 777   | Rebrand   
  

В приведенном выше сценарии
1) Старые идентификаторы 123 и 234 были перегруппированы в новый идентификатор 987.
2) Старый идентификатор 456 был разделен на новые идентификаторы 876 и 877.
3) OldID 567 был переименован в NewID 777

Еще раз спасибо!

Комментарии:

1. какую базу данных вы используете? Также поместите некоторые образцы данных

2. Спасибо. Добавлен в пример данных для иллюстрации вопроса.

3. Вы забыли упомянуть о взаимосвязи между oldID, newID и Relationship .

4. упс. ок. тоже добавлено.

5. Это все? У вас в таблице всего 5 строк, и вам нужен 3D-столбец с жестко заданными значениями?

Ответ №1:

Вы можете использовать COUNT() OVER PARTITION BY следующее. Это должно работать для большинства баз данных.

 SELECT oldid, 
       newid, 
       CASE 
         WHEN s = 1 
              AND r > 1 THEN 'Regroup' 
         WHEN r = 1 
              AND s > 1 THEN 'Split' 
         WHEN r = 1 
              AND s = 1 THEN 'Rebrand' 
         ELSE 'Wrong Data(Mix)' 
       END AS 'Relationship' 
FROM   (SELECT *, 
               Count(*) OVER(partition BY oldid) s, 
               Count(*) OVER(partition BY newid) r 
        FROM   [yourtablename]) t 
ORDER  BY oldid 
  

Я создал образец в SQL Server , который вы можете проверить здесь Онлайн-демонстрация в SQL Server

Вывод

  ------- ------- -------------- 
| OldId | NewId | Relationship |
 ------- ------- -------------- 
| 123   | 987   | Regroup      |
 ------- ------- -------------- 
| 234   | 987   | Regroup      |
 ------- ------- -------------- 
| 456   | 876   | Split        |
 ------- ------- -------------- 
| 456   | 877   | Split        |
 ------- ------- -------------- 
| 567   | 777   | Rebrand      |
 ------- ------- -------------- 
  

Ответ №2:

Это просто угадывание вашего требования, и оно работает независимо от используемой вами СУБД:

 select 
  t.OldID, t.NewID,
  case
    when exists (
      select 1 from tablename
      where newid = t.newid and oldid <> t.oldid
    ) then 'Regroup' 
    when exists (
      select 1 from tablename
      where newid <> t.newid and oldid = t.oldid
    ) then 'Split'
    else 'Rebrand'
  end Relationship
from tablename t
  

Смотрите демонстрацию

Комментарии:

1. Вау. Это работает отлично. Спасибо. Пойду узнаю, как работает ваш код, особенно что такое «когда существует» и «выбрать 1».

2. Прочитайте это: learn.microsoft.com/en-us/sql/t-sql/language-elements /…