У меня есть стол Продукты:
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
Но не знаю, как сделать именно так.
Возможно, вы захотите изучить CPlex и OPL. Но, может быть, это значит использовать пушку в кулачном бою.
Я продолжил с того места, где вы его оставили, и сочинил ожидаемый результат.
Преобразовывается как кт.е. топовая пара товаров и самая дорогая.
Объедините окончательный набор результатов с оператором объединения.
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
Хороший ответ дает объяснение в дополнение к рабочему коду.
@DaleK, по крайней мере, он опередил меня за минуту;)
@DaleK Я только что понял, что мой ответ был не совсем правильным, редактируя его.
Итак, 15 минут, включая объяснение :D
@Horaciux также уведомит меня, чтобы я мог проголосовать за него, если он выглядит хорошо
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
) кортежиnonexistent
записи, которая отличалась бы от этих трех, давала бы меньшую цену с p1
и p2
, чем p3
, но все же выше 3000Просто отметим, что GREATEST()
работает только на SQL Server 2022.
@Horaciux Я полностью переписал свой ответ, так как раньше он был не совсем правильным
Вы можете использовать
UNPIVOT