sterenas Ответов: 1

Цена предложения - SQL to obatin it


Привет! У меня возникли проблемы с получением правильной цены, если продукт предлагается.
Структура таблицы (нам нужно только 1 предложение в любое время на SKU):
Таблица Продуктов:
SKU, RegularPrice, OfferStartDate, OfferEndDate, OfferPrice
1, 100, 2017-01-01 00:00, 2017-12-31 23:59, 90
2, 200, 2017-01-01 00:00, 2017-10-30 23:59, 190
3, 300

Я попробовал следующий SQL, чтобы извлечь его, но я не могу его правильно использовать, как если бы я изменил SKU 1 OfferEndDate на yesterday, он все равно показывает цену предложения (должен показывать 0, так как срок его действия истек):

SELECT SKU , RegularPrice, (SELECT ISNULL((SELECT OfferPrice FROM Products aaa WHERE SKU = aaa.SKU AND OfferStartDate < getdate() and OfferEndDate > getdate()),0) as OfferPrice) FROM Products 


1. я возвращаю здесь 2 колонки, и мне нужно было бы выяснить, если OfferPrice > 0, то это предложение. Мне нужно вернуть обе цены, чтобы показать их.

2. для другого запроса, как я мог бы придумать SQL-оператор, который возвращает только один столбец цены с правильной ценой (т. е. обычную цену цены предложения)?

Спасибо за вашу помощь в этом вопросе SQL!
Серджио

Что я уже пробовал:

Попробовал использовать инструкцию SQL, описанную выше.

1 Ответов

Рейтинг:
8

Maciej Los

Не уверен, что правильно вас понял...
Кажется, вы хотите получить OfferPrice, но когда он равен нулю, то вы хотите вернуть RegularPrice. Итак, вы должны использовать Функция COALESCE() [^].

SELECT COALESCE(OfferPrice, RegularPrice) AS ActualPrice
FROM Products


Что касается ваших потребностей, то вы должны использовать левое соединение[^].

Проверить это:
DECLARE @tmp TABLE(SKU INT IDENTITY(1,1) NOT NULL, RegularPrice FLOAT, OfferStartDate DATETIME, OfferEndDate DATETIME, OfferPrice FLOAT)
DECLARE @d DATETIME = GETDATE()

INSERT INTO @tmp(RegularPrice, OfferStartDate, OfferEndDate, OfferPrice)
VALUES(100, '2017-01-01 00:00', '2017-12-31 23:59', 90), 
(200, '2017-02-01 00:00', '2017-10-30 23:59', 190),
(300, '2017-03-01 00:00', '2017-10-15 23:59', 270),
(420, '2017-04-01 00:00', '2017-09-30 23:59', 390),
(280, '2017-05-01 00:00', '2017-11-30 23:59', 250)

SELECT A.SKU, COALESCE(B.OfferPrice, A.RegularPrice) AS CurrentPrice
FROM @tmp AS A
LEFT JOIN (
	SELECT *
	FROM @tmp
	WHERE OfferStartDate<= @d AND OfferEndDate>=@d
) AS B ON A.SKU = B.SKU


Результат:
SKU	CurrentPrice
1	90
2	190
3	300 --regular price, an offer expired
4	420 --regular price, an offer expired
5	250


Для получения более подробной информации, пожалуйста, смотрите: Выбор между COALESCE и ISNULL в SQL Server[^]
Визуальное представление SQL-соединений[^]