2014-10-21 5 views
0

Как рассчитать окончательную цену в таблице штук по критериям? Критерий будет установлен в таблице модификатор. Я думал о левом соединении, но возможно ли в хранимой процедуре выбрать тип модификатора? У каждой записи будет только один критерий, они не могут быть объединены.Как рассчитать цену в столбце на основе дополнительных критериев?

пунктов:

code | price_general 
--------------------------------- 
BIKE | 50 
CAR | 300 
BOAT | 600 
PLANE | 1200 

модификатор:

type | item  | amount 
---------------------------------- 
PERC | CAR   | 20 (add 20% on top) 
FIXE | BOAT  | 700 (fixed price 700) 
ADD | PLANE  | 10 (add +10 value) 

результат должен выглядеть следующим образом

code | price_general | price_final 
------------------------------------------------- 
BIKE | 50    | 50 
CAR | 300    | 360 
BOAT | 600    | 700 
PLANE | 1200    | 1210 

Возможно ли это в TSQL? Или я должен добавить дополнительную бизнес-логику в код C#?

Благодарим вас за идеи.

ответ

1

Вы можете использовать CASE statement с вашей логикой. Что-то вроде:

SELECT i.code, i.price_general, 
price_final = 
CASE m.type 
WHEN 'PERC' THEN i.price_general*(1 + m.amount/100) 
WHEN 'FIXE' THEN m.amount 
WHEN 'ADD' THEN i.price_general + m.amount 
ELSE i.price_general 
END 
FROM items i LEFT JOIN modifier m on i.item = m.code; 

Извинения для любых опечаток или ошибок синтаксиса, я использую Postgresql, но я надеюсь, вы получите идею ...

+0

Хорошо работает (после незначительных изменений для TSQL). Благодарю. – feronovak

0

разделить АМТ в и фиксируется
просто поставить 0 в вверх если вы хотите, чтобы все фиксированные
и 0 в фиксированной, если вы хотите, чтобы все до

select items.code 
    , items.price_general 
    , isnull(modifier.item, items.price_general, items.price_general * modifier.up + modifier.fixed) as [price_final] 
    from items 
    left join modifier 
    on modifier.item = items.code 
0

Попробуйте

SELECT I.CODE, 
     I.PRICE_GENERAL, 
     CASE 
     WHEN M.TYPE LIKE 'ADD%[%]%' THEN I.PRICE_GENERAL * (1 + M.AMOUNT/100) 
     WHEN M.TYPE LIKE 'FIXED%' THEN M.AMOUNT 
     WHEN M.TYPE LIKE 'ADD%' 
       AND M.TYPE NOT LIKE 'ADD%[%]%' THEN I.PRICE_GENERAL + M.AMOUNT 
     ELSE I.PRICE_GENERAL 
     END 
FROM ITEMS I 
     LEFT OUTER JOIN MODIFIER M 
        ON I.ITEM = M.CODE