Объединить две таблицы, используя полное внешнее соединение, с помощью скручивания - обнулить значения из таблицы соединений на основе количества строк - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть две таблицы, которые я хотел бы объединить, используя принципы полного внешнего соединения, но за исключением того, что совпадающие строки должны быть аннулированы, если число совпадающих строк в «правой» таблице меньше числа совпадающих строк в левой table - и наоборот.

Это имеет смысл с примером: приведенная ниже таблица [Транзакции] должна быть объединена с таблицей [Units Ordered] - в результате получается таблица 3td. Ключ соединения - это и идентификатор, и сезон / упорядоченный сезон.

Таблица [Упорядоченные единицы] содержит две строки с идентификатором 1 и упорядоченным сезоном 2017, а таблица [Транзакции] - две. Мне нужно извлечь значения Упорядоченные единицы и Упорядоченные Seaon только для одной соответствующей строки из таблицы [Упорядоченные единицы] - сохраняя вторую строку из таблицы [Транзакции], но с обнуляемыми значениями для Упорядоченных единиц и Упорядоченного сезона.

Это противоречит самой идее объединения, и я не уверен, возможно ли это вообще.

Таблицы должны быть загружены в Power Query, и я также попытался решить эту проблему здесь - безрезультатно.

Любые предложения или мысли приветствуются

Transactions

Units Ordered

Final result

Ответы [ 2 ]

1 голос
/ 03 апреля 2020
declare @l table (id int, val int default(10));
insert into @l(id) values (1),(2),(2),(3),(4),(4),(5),(5),(6);

declare @r table (id int, val int default(20));
insert into @r(id) values (1),(2),(3),(4),(4),(5),(5),(7);

select *
from
(
select *, row_number() over(partition by id order by val) as rownum
from @l 
)as l
full join
(
select *, row_number() over(partition by id order by val) as rownum
from @r 
)as r on l.id = r.id and l.rownum = r.rownum;

--..or..?
select 
    lid, case when lcount = rcount then lval end as lval, 
    rid, case when lcount = rcount then rval end as rval,
    lcount, rcount
from
(
select 
l.id as lid, l.val as lval, count(l.id) over(partition by l.id) as lcount, 
r.id as rid, r.val as rval, count(r.id) over(partition by r.id) as rcount
from @l as l
full join @r as r on l.id = r.id
) as src;
0 голосов
/ 03 апреля 2020

Если таблица unitsordered имеет только одну строку для комбинации (id, year), то в этом случае вы можете сгруппировать первую таблицу, чтобы иметь только одну строку для каждой комбинации (id, year). Если нет, то сначала вам нужно будет сгенерировать количество строк из таблицы unitsordered, а затем сохранить столько строк из первой таблицы для этой комбинации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...