SQL: согласовать количество, используя ту же таблицу - PullRequest
1 голос
/ 11 июня 2019

У меня есть эта таблица:

enter image description here

Попытка создать цепочку поставок бедного человека.Мы получаем сообщения об операции (R для получения, S для отправки).Каждое местоположение сообщает, используя свой идентификационный код (SRC), количество, которое они отправляют или получают, и пункт назначения.Если кто-то отправляет, пункт назначения - это то место, куда направляется товар, если он получает, поле пункта назначения - это то, откуда поступили данные.

Единственное место, где нет пункта назначения, - это HO (головной офис),корневой узел.

Теперь я хочу получить отчет о расхождениях.В последних 2 транзакциях (ID 21 и 22) отсутствуют сети 10 и 5. соответственно.

Я хочу объединить данные так, чтобы столбец dest соответствовал столбцу src, и увидел разницу между QTYS и QTYR.

Пример отчета: enter image description here

Но написанный мною SQL также дает некоторые ложные срабатывания?!?enter image description here

Мой код SQL:

SELECT datas.SRC, datas.QTYR - datar.qtyS AS Difference 
FROM data as datas JOIN data as datar on datas.dest = datar.src 
WHERE datas.QTYR - datar.qtyS < 0 GROUP BY datas.src

БД:

CREATE TABLE data (ID Int NOT NULL AUTO_INCREMENT, SRC NVARCHAR(20) NOT NULL, QTYR INT NOT NULL DEFAULT 0, QTYS INT NOT NULL  DEFAULT 0, DEST NVARCHAR(20), OP NVARCHAR(20) NOT NULL, PRIMARY KEY(ID));
INSERT INTO DATA (SRC, QTYR, DEST, OP) VALUES ("HO01",1500000,"","R");
INSERT INTO DATA (SRC, QTYR, DEST, OP) VALUES ("HO02",1500000,"","R");
INSERT INTO DATA (SRC, QTYS, DEST, OP) VALUES ("HO01",750000,"DO01","S");
INSERT INTO DATA (SRC, QTYS, DEST, OP) VALUES ("HO01",750000,"DO02","S");
INSERT INTO DATA (SRC, QTYS, DEST, OP) VALUES ("HO02",750000,"DO03","S");
INSERT INTO DATA (SRC, QTYS, DEST, OP) VALUES ("HO02",750000,"DO04","S");

INSERT INTO DATA (SRC, QTYR, DEST, OP) VALUES ("DO01",750000,"HO01","R");
INSERT INTO DATA (SRC, QTYR, DEST, OP) VALUES ("DO02",750000,"HO01","R");
INSERT INTO DATA (SRC, QTYR, DEST, OP) VALUES ("DO03",750000,"HO02","R");
INSERT INTO DATA (SRC, QTYR, DEST, OP) VALUES ("DO04",750000,"HO02","R");

INSERT INTO DATA (SRC, QTYS, DEST, OP) VALUES ("DO01",375000,"HC01","S");
INSERT INTO DATA (SRC, QTYS, DEST, OP) VALUES ("DO02",375000,"HC02","S");
INSERT INTO DATA (SRC, QTYS, DEST, OP) VALUES ("DO03",375000,"HC03","S");
INSERT INTO DATA (SRC, QTYS, DEST, OP) VALUES ("DO04",375000,"HC04","S");

INSERT INTO DATA (SRC, QTYR, DEST, OP) VALUES ("HC01",375000,"DO01","R");
INSERT INTO DATA (SRC, QTYR, DEST, OP) VALUES ("HC02",375000,"DO02","R");
INSERT INTO DATA (SRC, QTYR, DEST, OP) VALUES ("HC03",375000,"DO03","R");
INSERT INTO DATA (SRC, QTYR, DEST, OP) VALUES ("HC04",375000,"DO04","R");

INSERT INTO DATA (SRC, QTYS, DEST, OP) VALUES ("HC01",100000,"DP01","S");
INSERT INTO DATA (SRC, QTYS, DEST, OP) VALUES ("HC01",100000,"DP02","S");
INSERT INTO DATA (SRC, QTYR, DEST, OP) VALUES ("DP01",99990,"HC01","R");
INSERT INTO DATA (SRC, QTYR, DEST, OP) VALUES ("DP02",99995,"HC01","R");

1 Ответ

1 голос
/ 11 июня 2019

Я думаю, что этот запрос решит вашу проблему:

select *,
  qtyr-qtys as Diff
from (
  select SRC, sum(QTYR) as qtyr
  from data s
  group by SRC
  ) s
  join (
    select DEST, sum(QTYS) as qtys
    from data s
    group by DEST
    ) d
    ON s.SRC=d.DEST
where qtyr!=qtys

Он просто суммирует отправленные суммы, полученные суммы, сгруппированные по отправителю / получателю соответственно, а затем проверяет, совпадает ли число. Обратите внимание, что вы хотите сгруппировать по двум различным понятиям, сначала по отправителю, а затем по получателю. Эта часть может быть проблемой с вашим запросом.

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