2015-05-08 4 views
2

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

(StartLevel, DiscountFactor) 
(0, 1); 
(25, 0.95); 
(50, 0.90); 
(100, 0.75) 

Я хочу рассчитать общую стоимость. Если объем составляет 35, я хочу, чтобы умножить

Price x ((35-25) x 0.95 + (25-0) x 1) 

Если объем 200, он должен быть

Price x ((200-100) x 0.75 + (100-50) x .9+(50-25) x .95+(25) x 1) 

Может кто-нибудь помочь мне с запросом, который решает эту проблему?

+0

И некоторые выборочные данные – sqluser

+0

я не получил каких-либо достоверных результатов пока нет. Я думал о кресте, применяемом к SUM. Но где я застрял, когда я прихожу, чтобы разделить число columne на каждый уровень скидки. MSSQL 2012 или 2014 - это моя версия – AKG

+0

Возможно, я неверно истолковал версию sql. Если версия mssql 2008, есть ли решение для этого, которое не включает'LEAD ' – AKG

ответ

0

Для данного Volume и Price вы можете получить скидку на основе интервала, используя LEAD, который доступен в SQL Server 2012+ и далее.

Примеры данных

DECLARE @PriceTable TABLE(Volume INT,Price DECIMAL(9,2)) 

DECLARE @Discount TABLE(StartLevel int, DiscountFactor DECIMAL(9,2)) 


INSERT INTO @PriceTable 
VALUES(75, 20.5), 
(150, 20), 
(250, 20.5), 
(0, 15); 


INSERT INTO @Discount 
VALUES(0, 1), 
(25, 0.95), 
(50, 0.90), 
(100, 0.75); 

Запрос

SELECT Volume,Price,FinalPrice 
FROM @PriceTable P 
CROSS APPLY(
SELECT SUM(CASE WHEN (MaxLevel >=StartLevel) THEN (MaxLevel-StartLevel) ELSE 0 END *DiscountFactor)*P.Price as FinalPrice 
FROM 
(
SELECT CASE WHEN LEAD(StartLevel)OVER(ORDER BY StartLevel) < P.Volume THEN LEAD(StartLevel)OVER(ORDER BY StartLevel) ELSE P.Volume END MaxLevel,StartLevel, DiscountFactor 
FROM @Discount 
) IQ 
)T 

Выход

Volume Price FinalPrice 
75 20.50 1460.6250 
150 20.00 2625.0000 
250 20.50 4228.1250 
0 15.00 0.0000 
1

Это может помочь:

DECLARE @products TABLE 
    (
     id INT , 
     price MONEY , 
     volume INT 
    ) 
DECLARE @discounts TABLE 
    (
     id INT , 
     Level INT , 
     Factor MONEY 
    ) 

INSERT INTO @products 
VALUES (1, 10, 35), 
     (2, 15, 200) 

INSERT INTO @discounts 
VALUES (1, 0, 1), 
     (2, 25, 0.95), 
     (3, 50, 0.90), 
     (4, 100, 0.75) 



SELECT p.id, p.price * SUM(ca.m) 
FROM @products p 
     CROSS APPLY (SELECT * , 
           Factor * (-Level + LEAD(Level) OVER (PARTITION BY p.id ORDER BY Level, d)) AS m 
         FROM  (SELECT 1 AS d , 
              Level , 
              Factor 
            FROM  @discounts 
            WHERE  Level < p.volume 
            UNION ALL 
            SELECT 2 AS d , 
              p.volume , 
              0 
           ) t 
        ) ca 
GROUP BY p.id 

Без группировки его возвращения:

id price volume d Level Factor m 
1 10.00 35  1 0  1.00 25.00 
1 10.00 35  1 25  0.95 9.50 
1 10.00 35  2 35  0.00 NULL 
2 15.00 200  1 0  1.00 25.00 
2 15.00 200  1 25  0.95 23.75 
2 15.00 200  1 50  0.90 45.00 
2 15.00 200  1 100  0.75 75.00 
2 15.00 200  2 200  0.00 NULL 

Тогда просто group by продукт и sum из m результатов в:

id Total 
1 345.00 
2 2531.25 
Смежные вопросы