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

Откуда: Москва
Сообщений: 310
Исходные данные.

Есть таблица @a - здесь находятся идентификаторы людей
Есть таблица @b - здесь у каждого человека, есть какое-то количество счетов, разделенных по типу.

Задача.
Вывести в плоском виде список неповторяющихся уникальных счетов для каждого типа счета.

К примеру у клиента 1 есть:
счет 1 (тип 1)
счет 2 (тип 1)
счет 3 (тип 2)

В результате хотим получить:
IdСчет1Счет2
112
12NULL


Если будет клиент 2 со счетами:
счет 3 (тип 2)

В результате хотим получить:
IdСчет1Счет2
2NULL



SELECT @@VERSION

Microsoft SQL Server 2017

Пример исходных данных:
DECLARE @b TABLE (id INT, typ INT,account INT);

INSERT INTO @b
VALUES
(1, 1, 1),
(1, 1, 2),
(1, 2, 1),
(1, 2, 2),

(2, 1, 1),
(2, 1, 2),
(2, 2, 1),

(3, 2, 1),
(3, 2, 2),
(3, 1, 1),

(4,1,1),
(5,2,1),

(6,1,1),
(6,1,2),
(6,1,3),
(6,1,4),
(6,2,1);


Требуемый результат:
idB1accountB2account
111
122
2 11
22NULL
311
3NULL2
41NULL
5NULL1
611
62NULL
63NULL
64NULL
19 авг 18, 19:51    [21647330]     Ответить | Цитировать Сообщить модератору
 Re: Список уникальных записей в каждой колонке  [new]
invm
Member

Откуда: Москва
Сообщений: 9273
select
 coalesce(a.id, b.id), a.account, b.account
from
 (select id, account from @b where typ = 1) a full join
 (select id, account from @b where typ = 2) b on b.id = a.id and b.account = a.account
order by
 coalesce(a.id, b.id);
19 авг 18, 20:21    [21647344]     Ответить | Цитировать Сообщить модератору
 Re: Список уникальных записей в каждой колонке  [new]
Hamber
Member

Откуда: Москва
Сообщений: 310
invm, Наверное некорректный пример привел, полагая что счета у разных людей одинаковы.

Вот на таком примере исходных данных:

DECLARE @a TABLE(id INT);

INSERT INTO @a VALUES (1),(2),(3),(4),(5),(6);

DECLARE @b TABLE
(
    id INT,
    typ INT,
    account INT
);

INSERT INTO @b
VALUES
(1, 1, 1),
(1, 1, 2),
(1, 2, 3),
(1, 2, 4),
(2, 1, 5),
(2, 1, 6),
(2, 2, 7),
(3, 2, 8),
(3, 2, 9),
(3, 1, 10),
(4, 1, 11),
(5, 2, 12),
(6, 1, 13),
(6, 1, 14),
(6, 1, 15),
(6, 1, 16),
(6, 2, 17);
19 авг 18, 20:43    [21647354]     Ответить | Цитировать Сообщить модератору
 Re: Список уникальных записей в каждой колонке  [new]
invm
Member

Откуда: Москва
Сообщений: 9273
select
 coalesce(a.id, b.id), a.account, b.account
from
 (select distinct id, account, row_number() over (partition by id order by account) as rn from @b where typ = 1) a full join
 (select distinct id, account, row_number() over (partition by id order by account) as rn from @b where typ = 2) b on b.id = a.id and b.rn = a.rn
order by
 coalesce(a.id, b.id), coalesce(a.rn, b.rn);
?
19 авг 18, 21:10    [21647368]     Ответить | Цитировать Сообщить модератору
 Re: Список уникальных записей в каждой колонке  [new]
Hamber
Member

Откуда: Москва
Сообщений: 310
invm, тьфу ты :) Как все легко оказалось. Спасибо огромное)

А я уже начал мудрить через GROUPING SETS / DENSE_RANK.
19 авг 18, 21:20    [21647377]     Ответить | Цитировать Сообщить модератору
 Re: Список уникальных записей в каждой колонке  [new]
invm
Member

Откуда: Москва
Сообщений: 9273
Поправка
select
 coalesce(a.id, b.id), a.account, b.account
from
 (select id, account, row_number() over (partition by id order by account) as rn from @b where typ = 1 group by id, account) a full join
 (select id, account, row_number() over (partition by id order by account) as rn from @b where typ = 2 group by id, account) b on b.id = a.id and b.rn = a.rn
order by
 coalesce(a.id, b.id), coalesce(a.rn, b.rn);
19 авг 18, 21:38    [21647389]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить