#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 /…