#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)