Как выбор может соответствовать каждому значению только один раз? - PullRequest
0 голосов
/ 06 июля 2018

Я сопоставляю значения сумм из table1 и table2, таблицы имеют дубликаты и различное количество строк. Любая сумма может быть сопоставлена ​​только один раз (поэтому не так, как работает стандартный выбор), потому что общая сумма в выборе для таблицы должна оставаться такой же, как если бы я добавил все вставленные значения из этой таблицы.

CREATE TABLE table1 (
    table1_amount int
);
INSERT INTO table1 (table1_amount)
VALUES
    (22),
    (11),
    (35),
    (45),
    (45),
    (65),
    (22),
    (22),
    (878),
    (56);

CREATE TABLE table2 (
    table2_amount int
);
INSERT INTO table2 (table2_amount)
VALUES
    (324),
    (43),
    (34),
    (35),
    (22),
    (22),
    (12),
    (35),
    (6);

Стандартный метод выбора возвращает 6 строк, соответствующих трем «22» из table1, двум «22» из table2 (поэтому каждое «22» из table1 сопоставляется дважды):

SELECT table1.table1_amount, table2.table2_amount
FROM table1 FULL OUTER JOIN table2 ON table1.table1_amount=table2.table2_amount;

table1_amount table2_amount
22 22
22 22
22 22
22 22
22 22

Теперь я хотел бы иметь только 2 совпадения + 1 непревзойденную сумму из table1, поэтому:

table1_amount table2_amount
22 22
22 22
22 NULL

Как ты можешь это сделать? Я указываю здесь SQL, но любое решение (Excel, Access) было бы хорошо.

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Попробуйте это:

выберите cte1.table1_amount, cte2.table2_amount от (Выберите *, ROW_NUMBER () более (разделить на порядок table1_amount на table1_amount) в качестве ранжирования от @ table1) в качестве cte1 левое объединение (выберите *, ROW_NUMBER () более (разделить на порядок table2_amount по table2_amount) как ранжирование от @ table2) как cte2 на cte1.table1_amount = cte2.table2_amount и cte1.ranking = cte2.ranking

0 голосов
/ 06 июля 2018

Попробуйте, используя Row_Number():

with cte1 as
(Select *, ROW_NUMBER() over (partition by table1_amount order by table1_amount) as ranking from table1),
 cte2 as
(Select *,ROW_NUMBER() over (partition by table2_amount order by table2_amount) as ranking from table2)
Select cte1.table1_amount, cte2.table2_amount from cte1 FULL OUTER JOIN cte2 on cte1.table1_amount = cte2.table2_amount and cte1.ranking = cte2.ranking
...