Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Фильтрация одинаковых записей в таблице  [new]
bennisi
Member

Откуда:
Сообщений: 10
Доброго времени суток, такая задача, есть таблица с обьектами, но при объединении с атрибутами получается "каша", помогите, пожалуйста, убрать лишние записи!

таблица с файлами:

idPerent id productversion
NULL1СБ1
1 200Корпус1
1 201Болт М81
NULL2СБ22
2 300Корпус2
2 201 Болт М81
2 202 Винт1
2203 Гайка1

необходимо соединить с таблицей атрибуты:
id name_type type
1 Разработал Иванов
1 Наименование МоторДиз
1 Раздел спец. Сборка
2 Разработал Петров
2 Наименование МоторДиз
2 Раздел спец. Сборка
200Наименование Блок
300Наименование Блок
201Раздел спец. Стандартные изд.
201Марка мат. Сталь
202Марка мат. Железо
203Раздел спец. Стандартные изд.

получается у некоторых файлов несколько атрибутов, основной "Наименование", если его нет то "Раздел спец." если и его нет то "Марка мат.", и бывает совсем без атрибутов.
И получить такой результат:
idPerent id productversionname_type type
NULL1СБ1Наименование МоторДиз
1 200Корпус1Наименование Блок
1 201Болт М81Раздел спец. Стандартные изд.
NULL2СБ22Наименование МоторДиз
2 300Корпус2Наименование Блок
2 201 Болт М82Раздел спец. Стандартные изд.
2 202 Винт1Марка мат. Железо
2203 Гайка1Раздел спец. Стандартные изд.

Заранее спасибо!
13 мар 19, 12:08    [21831137]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация одинаковых записей в таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 8560
with t as
(
 select
  b.id, b.name_type, b.type,
  row_number() over (partition by b.id order by a.n) as rn
 from
  (values (1, 'Наименование'), (2, 'Раздел спец.'), (3, 'Марка мат.')) a(n, name_type) join
  [Таблица с атрибутами] b on b.name_type = a.name_type
)
select
 a.idPerent, a.id, a.product, a.version, t.name_type, t.type
from
 [Таблица с файлами] a left join
 t on t.id = a.id and t.rn = 1;
Или
select
 a.idPerent, a.id, a.product, a.version,
 coalesce(b.name_type, c.name_type, d.name_type) as name_type,
 coalesce(b.type, c.type, d.type) as type
from
 [Таблица с файлами] a left join
 [Таблица с атрибутами] b on b.id = a.id and b.name_type = 'Наименование' left join
 [Таблица с атрибутами] c on b.id = a.id and c.name_type = 'Раздел спец.' left join
 [Таблица с атрибутами] d on b.id = a.id and d.name_type = 'Марка мат.';
13 мар 19, 12:44    [21831199]     Ответить | Цитировать Сообщить модератору
 Re: Фильтрация одинаковых записей в таблице  [new]
bennisi
Member

Откуда:
Сообщений: 10
invm, ты красавчик, большое спасибо!!! первый запрос у меня почему-то дольше выполняет, а второй прям то что надо! Я с самого начала не правильно стал делать запрос-выборку через where, зато благодаря тебе, для себя открыл новую функцию)) - coalesce
13 мар 19, 16:54    [21831535]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить