CASE выражение для нескольких параметров - PullRequest
3 голосов
/ 06 февраля 2020

У меня есть эти данные:

CREATE TABLE #MyTable (Names VARCHAR(50), Category VARCHAR(50), OrderDate DATE, Quantity INT)
INSERT INTO #MyTable VALUES
       ('Buchanan', 'Dairy', '2019-10-08', 12),
       ('Buchanan', 'Grains', '2019-11-18', 3),
       ('Buchanan', 'Dairy', '2019-07-15', 3),
       ('Suyama', 'Produce', '2019-07-08', 18),
       ('Suyama', 'Produce', '2019-09-03', 27),
       ('Peacock', 'Seafood', '2019-10-30', 37),
       ('Peacock', 'Produce', '2019-07-24', 15),
       ('Peacock', 'Condiments', '2019-07-29', 23),
       ('Leverling', 'Grains', '2019-06-05', 49),
       ('Leverling', 'Cereals', '2019-08-07', 31),
       ('Leverling', 'Condiments', '2019-08-21', 42),
       ('Peacock', 'Confections', '2019-12-16', 17),
       ('Peacock', 'Dairy', '2019-09-04', 15),
       ('Peacock', 'Dairy', '2019-11-17', 44),
       ('Leverling', 'Dairy', '2019-11-12', 11),
       ('Leverling', 'Beverages', '2019-06-19', 50),
       ('Leverling', 'Confections', '2019-06-22', 7),
       ('Buchanan', 'Beverages', '2019-12-18', 23),
       ('Buchanan', 'Poultry', '2019-11-09', 29),
       ('Buchanan', 'Produce', '2019-08-18', 14);

Я хочу предоставить несколько параметров для месяцев.

Используя этот запрос

DECLARE @Months VARCHAR(10)
SET @Months = 'Jun-19','Aug-19'

SELECT
    Names,
    Category,
    OrderDate,
    Quantity,
    FORMAT(OrderDate,'MMM-yy') AS MonthYear,
    CASE
       WHEN FORMAT(OrderDate,'MMM-yy') IN (@Months) THEN Quantity
    END AS MonthSelected
FROM #MyTable
ORDER BY OrderDate

Если я предоставлю одно значение, например 'Jun-19', оно будет работать нормально.

Однако, если я предоставил более одного значения, например, 'Jun-19', 'Aug-19', будет выдано сообщение об ошибке:

Сообщение 102, Уровень 15, Состояние 1, Строка 15 Неверный синтаксис рядом с ','

Любая помощь в том, как я могу передать несколько месяцев параметру?

Требуемый вывод при передаче 'Jun-19', 'Aug-19' в качестве примера

NOTE Я не могу использовать параметр в предложении where, так как клиент хочет видеть все данные и месяц, не выбранный должен быть НЕДЕЙСТВИТЕЛЕН

Желаемый вывод

enter image description here

Ответы [ 6 ]

4 голосов
/ 06 февраля 2020

Вам необходимо объявить переменную, как показано ниже.

 SET @Months = '''Jun-19'',''Aug-19'''

Вы можете использовать string_split():

(CASE WHEN FORMAT(OrderDate,'MMM-yy') IN (SELECT value FROM STRING_SPLIT(@Months, ','))
      THEN Quantity
 END) AS MonthSelected   
2 голосов
/ 06 февраля 2020

Нельзя указывать несколько значений в переменной varchar следующим образом:

DECLARE @Months VARCHAR(10)

SET @Months = 'Jun-19','Aug-19'

Но вы можете использовать разделитель и читать эти различные значения с помощью функции string_split:

DECLARE @Months VARCHAR(512)

SET @Months = 'Jun-19,Aug-19'

Запрос теперь будет:

SELECT 
    Names,  
    Category,   
    OrderDate,
    Quantity,
    FORMAT(OrderDate,'MMM-yy') AS MonthYear,
    CASE 
       WHEN FORMAT(OrderDate,'MMM-yy')  IN  (SELECT value FROM STRING_SPLIT(@Months, ','))
          THEN Quantity 
    END AS MonthSelected    
FROM
    #MyTable
ORDER BY 
    OrderDate
2 голосов
/ 06 февраля 2020

Вот один неуклюжий способ:

DECLARE @Months VARCHAR(100) = 'Jun-19,Aug-19';
SELECT Names
     , Category
     , OrderDate
     , Quantity
     , FORMAT(OrderDate,'MMM-yy') AS MonthYear
     , CASE WHEN ',' + @Months + ',' LIKE '%,' + FORMAT(OrderDate,'MMM-yy') + ',%' THEN Quantity END AS MonthSelected
FROM #MyTable
ORDER BY OrderDate

И альтернатива, использующая переменные таблицы:

DECLARE @Months TABLE(MonthYear VARCHAR(6));
INSERT INTO @Months VALUES ('Jun-19'), ('Aug-19');
SELECT Names
     , Category
     , OrderDate
     , Quantity
     , FORMAT(OrderDate,'MMM-yy') AS MonthYear
     , CASE WHEN EXISTS (SELECT 1 FROM @Months WHERE MonthYear = FORMAT(OrderDate,'MMM-yy')) THEN Quantity END AS MonthSelected
FROM #MyTable
ORDER BY OrderDate
2 голосов
/ 06 февраля 2020

Вам нужно объявить @Months с varchar(50), чтобы вместить больше дат. Также

Я изменил запрос на динамический c запрос.

DECLARE @Months VARCHAR(50)

SET @Months = '''Jul-19'',''Aug-19'''

DECLARE @sql VARCHAR(max) = ' SELECT Names,   
           Category,    
           OrderDate,
           Quantity,
           FORMAT(OrderDate,''MMM-yy'') AS MonthYear,
           CASE WHEN  FORMAT(OrderDate,''MMM-yy'')  IN (' + @Months + ' ) THEN Quantity END AS MonthSelected    
    FROM #MyTable
    ORDER BY OrderDate'

EXECUTE (@sql)
1 голос
/ 06 февраля 2020

Вам необходимо обновить @Month переменный размер как

DECLARE @Months VARCHAR(50)

Мы не можем объявить переменную, например @Months = 'Jun-19','Aug-19', это должно быть @Months = 'Jun-19,Aug-19'.

Сначала нужно разбить строку на ',' и сохраните результат во временной таблице.

SELECT value  INTO #temptable FROM STRING_SPLIT(@Months, ',')

, а затем вставьте данные из этой временной таблицы.

   WHEN FORMAT(OrderDate,'MMM-yy')  IN (SELECT value  from #temptable) 

, а затем удалить временную таблицу как

DROP TABLE #temptable;
1 голос
/ 06 февраля 2020

Вы можете использовать шаблон как

(case YourConditionalValue
     When X then expression
     when y then  expression
     when z then expression
else expression end)

Надеюсь, он будет работать для вас

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...