Выберите самую дешевую цену и затем сгруппируйте ее по поставщику? - PullRequest
0 голосов
/ 01 июля 2019

Я хочу предоставить технической команде по закупкам настройку поставщика по умолчанию, чтобы они знали, где заказать деталь.Это основано на таблице под названием price_book.Для этого мне нужна новая таблица с номером детали, самой дешевой ценой и кодом поставщика, чтобы обработать ее через систему.Как я могу выбрать только поставщика, который предлагает самую низкую цену?

Я делаю это, чтобы упростить процесс заказа для технической группы по закупкам.Я зашел так далеко, что у меня только самая низкая цена на одного поставщика (относительно минимального количества заказа).То, что мне не хватает, это та часть, в которой выбран только один поставщик с самой дешевой ценой.Таким образом, на номер по наименьшей цене с соответствующим поставщиком.

Запрос довольно короткий:

SELECT DISTINCT pb.partno, MIN(pb.purch_price * c.rate) AS 'cheapest_price', pb.supplier
FROM price_book pb
LEFT JOIN currency c ON c.currency = pb.currency
WHERE pb.contract_id <> 0
AND pb.expire_date > Datediff(Day, '31 Dec 1971', Getdate())
AND pb.order_type = 'P'
AND pb.condition = 'N'
GROUP BY partno, supplier

Предложение WHERE не важно, поскольку оно связано с внутренними процессами.

Результатом должен быть список с колонками partnumber, ценой и соответствующим поставщиком.На один номер с поставщиком должна быть только самая низкая цена.

Ответы [ 4 ]

0 голосов
/ 04 июля 2019

Я нашел код, который работает для меня:

SELECT B.partno,
MAX(C.supplier) AS supplier
FROM

(SELECT A.partno,
MIN(A.price) AS price
FROM

(SELECT DISTINCT pb.partno AS partno, MIN(pb.purch_price * c.rate) AS price, pb.supplier AS supplier
FROM price_book pb
LEFT JOIN currency c ON c.currency = pb.currency
LEFT JOIN part p ON p.partno = pb.partno
WHERE pb.contract_id <> 0
AND pb.expire_date > Datediff(Day, '31 Dec 1971', Getdate())
AND pb.order_type = 'P'
AND pb.condition = 'N'
AND p.mat_class IN ('C', 'E')
GROUP BY pb.partno, supplier) A

GROUP BY A.partno) B

JOIN (SELECT DISTINCT pb.partno AS partno, MIN(pb.purch_price * c.rate) AS price, pb.supplier AS supplier
FROM price_book pb
LEFT JOIN currency c ON c.currency = pb.currency
LEFT JOIN part p ON p.partno = pb.partno
WHERE pb.contract_id <> 0
AND pb.expire_date > Datediff(Day, '31 Dec 1971', Getdate())
AND pb.order_type = 'P'
AND pb.condition = 'N'
AND p.mat_class IN ('E', 'C')
GROUP BY pb.partno, supplier) C ON B.partno=C.partno and B.price=C.price
GROUP BY B.partno

Большое спасибо за поддержку, которую вы оказали мне, ребята !!

Приветствия, Доминик

0 голосов
/ 01 июля 2019

Вы можете попробовать функцию Windows для этой цели, код будет аналогичен приведенному ниже примеру

Примечание - код не проверен.

SELECT * from
(SELECT pb.partno,pb.supplier,pb.purch_price * c.rate as price, 
row_number() over(partition by pb.partno,pb.supplier order by pb.purch_price * c.rate )rn
FROM price_book pb
LEFT JOIN currency c ON c.currency = pb.currency
WHERE pb.contract_id <> 0
AND pb.expire_date > Datediff(Day, '31 Dec 1971', Getdate())
AND pb.order_type = 'P'
AND pb.condition = 'N')a
where a.rn=1
0 голосов
/ 01 июля 2019

Посмотрите на:

DECLARE @priceBook TABLE (PriceID       INT IDENTITY(1, 1)
,                         PartNo        NVARCHAR(10)
,                         Price         DECIMAL(18, 2)
,                         fk_SupplierID INT);

INSERT INTO @priceBook (PartNo, Price, fk_SupplierID)
VALUES (N'123', 8.99, 1)
,      (N'123', 9.99, 2)
,      (N'456', 10.99, 1)
,      (N'456', 3.99, 2)
,      (N'456', 12.99, 3);

WITH cte AS
    (SELECT PriceID
     ,      PartNo
     ,      Price
     ,      fk_SupplierID
     ,      ROW_NUMBER() OVER (PARTITION BY PartNo
ORDER BY Price ASC) RN
       FROM @priceBook)
SELECT  cte.PriceID
,       cte.PartNo
,       cte.Price
,       cte.fk_SupplierID
  FROM  cte
 WHERE  rn = 1;

Это базовый пример оконной функциональности, упомянутой выше. Это работает на MS SQL Server, не уверен насчет mySQL. Пройдите тест, и если он сработает для вас, вы можете настроить его под свою точную структуру.

0 голосов
/ 01 июля 2019

Попробуйте TOP(1) WITH TIES

SELECT TOP(1) WITH TIES pb.partno, pb.purch_price * c.rate [cheapest_price], pb.supplier
FROM price_book pb
LEFT JOIN currency c ON c.currency = pb.currency
WHERE pb.contract_id <> 0
AND pb.expire_date > Datediff(Day, '31 Dec 1971', Getdate())
AND pb.order_type = 'P'
AND pb.condition = 'N'
ORDER BY row_number() over(partition by partno order by pb.purch_price * c.rate [cheapest_price] desc);
...