Как использовать функцию CASE WHEN в SQL Server - PullRequest
3 голосов
/ 10 мая 2019

Я пытаюсь решить эту проблему, и я не уверен, что использование CASE WHEN является правильным решением.

Я пытаюсь манипулировать данными.Если продукт равен A, тогда цена должна быть 100, а не цена из таблицы, и я не уверен, как этого добиться.

CREATE TABLE Test 
(
     Product VARCHAR(250), 
     subproduct VARCHAR(250), 
     Orderdate DATETIME
);

INSERT INTO TEST (product, subproduct, orderdate)  
VALUES ('A', 'blue',  '2019/01/01'), 
       ('B', 'orange','2019/01/11'),  
       ('C', 'lemon', '2019/01/15'),  
       ('D', 'lemon', '2019/01/20'),
       ('A', 'blue',  '2019/12/31'), 
       ('B', 'orange','2019/12/31'),  
       ('C', 'lemon', '2019/12/15'),  
       ('D', 'lemon', '2019/12/31');

CREATE TABLE PriceTest 
(
     Product VARCHAR(250), 
     Price NUMERIC(10,2), 
     Pricedate DATETIME
)

INSERT INTO PriceTest (product, price, pricedate)  
VALUES ('A', 10.00,'2019/12/31'), 
       ('B', 50.00,'2019/12/31'),  
       ('C', 30.00,'2019/12/31'),  
       ('D', 50.00,'2019/12/31'),
       ('A', 20.00,'2019/10/31'), 
       ('B', 40.00,'2019/10/31'),  
       ('C', 50.00,'2019/10/31'),  
       ('D', 10.00,'2019/11/30');

Выбор запроса:

SELECT
    t.product, t.subproduct, p.price, p.pricedate 
FROM
    test t
JOIN
    pricetest p ON p.product = t.product 
WHERE 
    p.pricedate = '12/31/2019' 
ORDER BY
    t.product

Текущие результаты:

   product  subproduct  price   pricedate
   ---------------------------------------
    A       blue        10      12/31/2019
    A       blue        10      12/31/2019
    B       orange      50      12/31/2019
    B       orange      50      12/31/2019
    C       lemon       30      12/31/2019
    C       lemon       30      12/31/2019
    D       lemon       50      12/31/2019
    D       lemon       50      12/31/2019

Желаемый результат: всякий раз, когда продукт = A, Цена должна быть = 100, в противном случае цена остается той же самой из таблицы цен для других.

   product  subproduct  price   pricedate
   ---------------------------------------
     A      blue        100     12/31/2019
     A      blue        100     12/31/2019
     B      orange      50      12/31/2019
     B      orange      50      12/31/2019
     C      lemon       30      12/31/2019
     C      lemon       30      12/31/2019
     D      lemon       50      12/31/2019
     D      lemon       50      12/31/2019

1 Ответ

1 голос
/ 10 мая 2019

Да, вы можете использовать CASE для этого:

select 
    t.product
    ,t.subproduct
    ,CASE WHEN t.product = 'A' 
        THEN 100
        ELSE p.price
    END AS price
    ,p.pricedate 
from 
    test t
    join pricetest p on p.product = t.product 
where 
    p.pricedate = '20191231' 
order by t.product

Кстати, вам действительно следует использовать следующий формат для литералов даты в SQL Server: YYYYMMDD.

Не пишите

pricedate = '12/31/2019' 

Пишите

pricedate = '20191231' 

См. Плохие привычки, которые нужно выкинуть: неправильная обработка запросов даты / диапазона для получения дополнительной информацииподробности.

...