Запрос, чтобы найти 2 самых дешевых товара, суммарная стоимость которых дает 3000

У меня есть стол Продукты:

ProductName          Price  
straight jeans       1500  
slim jeans           2500  
Denim jacket         3000  
Denim shorts         800  
Skinny jeans         1700  
loose Jeans          2100  
mom Jeans            2800  
wide jeans           1850  
distressed jeans     1100  
bootcut jeans        1350

За купленные две разные вещи общей стоимостью 3000 и более дают третью в подарок. Мне нужен SQL-запрос, чтобы потратить минимум на две вещи, а третью взять как самую дорогую.

Единственное, что я придумал, это перебрать все возможные комбинации и найти самую дешевую комбинацию за 3000.

WITH Products_sum AS (
  SELECT p1.ProductName AS ProductName1, p2.ProductName AS ProductName2, p1.Price + p2.Price AS TotalPrice
  FROM products p1
  JOIN products p2
    ON p1.ProductName < p2.ProductName
)
SELECT top 1 ProductName1, ProductName2, TotalPrice
FROM Products_sum
WHERE TotalPrice >= 3000
order by TotalPrice asc

Я ожидаю ответа типа:

bootcut jeans        1350
Skinny jeans         1700
Denim jacket         3000

Но не знаю, как сделать именно так.

Вы можете использовать UNPIVOT

Joel Coehoorn 01.02.2023 19:50

Возможно, вы захотите изучить CPlex и OPL. Но, может быть, это значит использовать пушку в кулачном бою.

Shiasu-sama 01.02.2023 19:58
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
78
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я продолжил с того места, где вы его оставили, и сочинил ожидаемый результат.

Преобразовывается как кт.е. топовая пара товаров и самая дорогая.

Объедините окончательный набор результатов с оператором объединения.

WITH Products_sum AS (
  SELECT p1.ProductName AS ProductName1
    , p2.ProductName AS ProductName2
    , p1.Price + p2.Price AS TotalPrice
    , p1.Price Price1
    , p2.Price Price2
  FROM products p1
  JOIN products p2
    ON p1.ProductName < p2.ProductName
),
topProducts as (SELECT top 1 ProductName1, ProductName2, Price1, Price2
FROM Products_sum
WHERE TotalPrice >= 3000
order by TotalPrice asc),
moreExpensive as (
    select top 1 ProductName, Price
    from products 
    order by price desc
)
select productName, Price from(
select 1 as pos, ProductName1 ProductName, Price1 Price from topProducts
union
select 2, ProductName2 , Price2 from topProducts
union
select 3, ProductName, Price
from moreExpensive )q
order by pos

Хороший ответ дает объяснение в дополнение к рабочему коду.

Dale K 01.02.2023 20:12

@DaleK, по крайней мере, он опередил меня за минуту;)

Lajos Arpad 01.02.2023 20:16

@DaleK Я только что понял, что мой ответ был не совсем правильным, редактируя его.

Lajos Arpad 01.02.2023 20:20

Итак, 15 минут, включая объяснение :D

Horaciux 01.02.2023 20:21

@Horaciux также уведомит меня, чтобы я мог проголосовать за него, если он выглядит хорошо

Lajos Arpad 01.02.2023 20:22
SELECT p1.ProductName, p1.Price,
       p2.ProductName, p2.Price,
       p3.ProductName, p3.Price
FROM Products p1
JOIN Products p2
on p1.ProductName < p2.ProductName
JOIN Products p3
ON p2.ProductName < p3.ProductName AND 
       p1.Price + p2.Price + p3.Price > 3000
LEFT JOIN Products nonexistent
ON NOT (nonexistent.ProductName IN (p1.ProductName, p2.ProductName, p3.ProductName)) AND
   p1.Price + p2.Price + nonexistent.Price > 3000 AND
   nonexistent.Price < p3.Price
WHERE nonexistent.ProductName IS NULL

Мы

  • выберите все (p1, p2, p3) кортежи
  • где их имя отличается
  • их цена больше 3000
  • и не существует ни одной nonexistent записи, которая отличалась бы от этих трех, давала бы меньшую цену с p1 и p2, чем p3, но все же выше 3000

Просто отметим, что GREATEST() работает только на SQL Server 2022.

Horaciux 01.02.2023 20:28

@Horaciux Я полностью переписал свой ответ, так как раньше он был не совсем правильным

Lajos Arpad 01.02.2023 20:31

Другие вопросы по теме