У меня проблема, на которую я потратил много времени. Мне нужно отобразить пары элементов (Item1, Item2, How many), которые появляются в счетах-фактурах, и сколько пар повторяется. Таблица, которая связывает счета-фактуры с товарами, называется «Транзакции».

У меня есть 3 таблицы:
Элементы: IdItem, Name
Транзакции: IdTransaction, IdInvoice, IdItem
Счета: IdInvoice

Результат SQL-запроса должен быть:

Item1 | Item2 | Число

-1
areox 11 Фев 2021 в 13:37

2 ответа

Лучший ответ

Это звучит как самосоединение и агрегирование:

select t1.IdItem as IdItem1, t2.IdItem as IdItem2, count(*)
from transactions t1 join
     transactions t2
     on t1.IdInvoice = t2.IdInvoice and
        t1.IdItem < t2.IdItem
group by t1.IdItem, t2.IdItem
order by count(*) desc;
0
Gordon Linoff 11 Фев 2021 в 11:26

Предположим, что ваши таблицы выглядят так:

CREATE TABLE Items (
   IDItem INT,
   Name VARCHAR,
   PRIMARY KEY(IDItem)
);

CREATE TABLE Invoices (
   IDInvoice INT,
   PRIMARY KEY(IDInvoice)
);
CREATE TABLE Transactions (
   IDTransaction INT,
   IDInvoice INT,
   IDItem INT,
   PRIMARY KEY(IDTransaction),
   FOREIGN KEY (IDItem) REFERENCES Items(IDItem),
   FOREIGN KEY (IDInvoices) REFERENCES Invoices(IDInvoices)
)

Если это правда, вам нужно запросить такие результаты:

SELECT i.Name,in.IDInvoice FROM Transactions t
JOIN Items i ON i.IDItem = t.IDItem
JOIN Invoices in ON in.IDInvoice = t.IDInvoice
WHERE i.Name = item1
-1
T0ny1234 11 Фев 2021 в 12:02
66153061