Как сравнить 2 поля и вернуть наименьшее значение каждой записи? - PullRequest
3 голосов
/ 12 января 2011

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

Я сделал запрос, которыйвыполняет внешнее левое соединение таким образом, чтобы оно возвращало таблицу наших продуктов с указанием и ценой каждого поставщика, например:

Ref |Название продукта |Поставщик 1 Ref |Поставщик 1 Цена |Поставщик 2 Ref |Поставщик 2 Цена

Вот запрос, который я использовал:

SELECT Catalog.Ref, Catalog.[Product Name], Catalog.Price, 
    [D Products].[Supplier Ref], [D Products].Cost, 
    [GS Products].[Supplier Ref], [GS Products].Cost

FROM ([Catalog] LEFT JOIN [D Products] ON Catalog.Ref = [D Products].Ref)

LEFT JOIN [GS Products] ON Catalog.Ref = [GS Products].Ref;

Не все продукты доступны от обоих поставщиков, поэтому есть внешнее соединение.

Что я хочусделать (с запросом?) - это взять таблицу, созданную по вышеуказанному запросу, и просто показать ссылку на продукт, ссылку на самого дешевого поставщика и цену самого дешевого поставщика, то есть:

Ref |Самый дешевый поставщик Ref |Самая низкая цена поставщика

К сожалению, мои знания SQL не достаточно хороши, чтобы понять это, но если кто-то может помочь, я был бы очень признателен.

Спасибо, Роб

Ответы [ 3 ]

4 голосов
/ 12 января 2011

Пожалуйста, рассмотрите одну таблицу для хранения данных о стоимости вашего поставщика.С этим примером product_catalog data:

product_id product_name price
         1 foo              5
         2 bar             10
         3 baz             15

Таблица поставщиков может выглядеть следующим образом:

supplier_id product_id cost
D                    1 2.5
D                    2 7.5
GS                   1 2.75
GS                   3 10

Тогда запрос GROUP BY, qryLowestPrice, покажет вам самую низкую стоимость для каждого продукта:

SELECT s.product_id, Min(s.cost) AS MinOfcost
FROM suppliers AS s
GROUP BY s.product_id;

Затем вы можете использовать qryLowestPrice в другом запросе, чтобы получить другую необходимую информацию (product_name и supplier_id):

SELECT q.product_id, p.product_name, p.price, s.supplier_id, s.cost
FROM
    (qryLowestPrice AS q
    INNER JOIN product_catalog AS p
    ON q.product_id = p.product_id)
    INNER JOIN suppliers AS s
    ON (q.MinOfcost = s.cost) AND (q.product_id = s.product_id);

Это вывод этого второго запроса, основанный наПример данных выше:

product_id product_name price supplier_id cost
         1 foo              5 D           2.5
         2 bar             10 D           7.5
         3 baz             15 GS          10
1 голос
/ 12 января 2011

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

SELECT  Catalog.Ref, 
        Catalog.[Product Name], 
        Catalog.Price, 
        [D Products].[Supplier Ref], 
        [D Products].Cost, 
        [GS Products].[Supplier Ref], 
        [GS Products].Cost,
        iif ([D Products].Cost < [GS Products].Cost, [D Products].[Supplier Ref], [GS Products].[Supplier Ref]) AS CheapestSupplier,
        iif ([D Products].Cost < [GS Products].Cost, [D Products].Cost, [GS Products].Cost) AS CheapestSupplierPrice
FROM (  [Catalog] LEFT JOIN 
        [D Products] ON Catalog.Ref = [D Products].Ref) LEFT JOIN 
        [GS Products] ON Catalog.Ref = [GS Products].Ref;
0 голосов
/ 12 января 2011

Я думаю, что вы захотите получить соответствующую ссылку поставщика по самой низкой цене. Это можно сделать с помощью конструкции CASE WHEN:

CASE WHEN expression THEN true_part ELSE false_part END

Это будет:

SELECT Ref,
  CASE WHEN Supplier1Price < Supplier2Price THEN Supplier1Ref ELSE Supplier2Ref END AS "Cheapest Supplier Ref",
  CASE WHEN Supplier1Price < Supplier2Price THEN Supplier1Price ELSE Supplier2Price END AS "Cheapest Supplier Price"

Поскольку вы используете Access, синтаксис немного отличается. Вы можете использовать функцию IIF(condition, true_part, false_part).

SELECT Ref,
  IIF(Supplier1Price < Supplier2Price, Supplier1Ref, Supplier2Ref) AS "Cheapest Supplier Ref",
  IIF(Supplier1Price < Supplier2Price, Supplier1Price, Supplier2Price) AS "Cheapest Supplier Price"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...