Использование инструкции case для ВЫБОРА AS в SQL Server

#sql #sql-server

#sql #sql-server

Вопрос:

У меня есть фрагмент кода, в котором я объединяю две таблицы и выбираю определенные столбцы, один из столбцов (NetMarkdown) суммируется, и я хочу выделить его в 3 разных столбца на основе значения отдельного столбца (MKUP_MKDN_RSN_CD). Код, который у меня есть, выглядит следующим образом:

 SELECT ITEM_ID, MVNDR_PRTY_ID as 'MVNDR_PRTY_ID', sum(NetMarkdown)=(CASE MKUP_MKDN_RSN_CD
WHEN 4 THEN as 'Code4' 
WHEN 23 THEN as 'Code 23'
ELSE as 'Code Other'
END), 
FSCL_WK_DESC INTO ##temp FROM
STRMKDN LEFT JOIN TimeHierarchy
ON CAL_PRD_END_DT=CAL_DT
group by ITEM_ID, MVNDR_PRTY_ID, FSCL_WK_DESC, MKUP_MKDN_RSN_CD
 

Я получаю сообщение об ошибке в строке 1: «Неправильный синтаксис рядом с ‘='».

Я подхожу к этому совершенно неправильно? Каков был бы правильный подход к этому? Спасибо за вашу помощь

Комментарии:

1. Это немного сбивает с толку. Можете ли вы добавить примерные данные и ожидаемый результат?

Ответ №1:

Выполните три отдельных суммы:

 SELECT ITEM_ID, MVNDR_PRTY_ID as 'MVNDR_PRTY_ID',
    sum(CASE WHEN MKUP_MKDN_RSN_CD = 4 THEN NetMarkdown END) as Code4,
    sum(CASE WHEN MKUP_MKDN_RSN_CD = 23 THEN NetMarkdown END) as Code23,
    sum(CASE WHEN MKUP_MKDN_RSN_CD != 4 and
                  MKUP_MKDN_RSN_CD != 23 THEN NetMarkdown END) as CodeOther,
FSCL_WK_DESC INTO ##temp FROM
STRMKDN LEFT JOIN TimeHierarchy
ON CAL_PRD_END_DT=CAL_DT
group by ITEM_ID, MVNDR_PRTY_ID, FSCL_WK_DESC
 

Проблема с вашим существующим кодом заключается в том, что вы фактически пытаетесь изменить, какие столбцы отображаются в результирующем наборе (т. Е. Представьте, Что ни одна строка не имеет кода причины 4), что вы не можете сделать за пределами динамического SQL.

На данный момент это приведет к появлению NULL s, если конкретный код причины никогда не отображается — если вы хотите избежать этого, завершите SUM(...) s с помощью COALESCE(SUM(...),0)