БАЗОВОЕ выражение SQL- Case — изменение «Then 1 Else 0» для возврата количества строк, в которых оператор case имеет значение true

#sql #count #case

#sql #количество #регистр

Вопрос:

Я специалист по продажам, заинтересованный в дальнейшем совершенствовании своих навыков SQL. Stackoverflow до сих пор был для меня отличным ресурсом!

Цель:

Я хочу получить отчетливое количество всех наших клиентов по DMA (он же Metro, США), где приведенное ниже выражение case имеет значение true.

ПРОБЛЕМА

Прямо сейчас, когда я выполняю запрос, результирующее количество для столбца «текущий месяц -1» (который должен возвращать количество всех клиентов, которые соответствуют оператору case), просто возвращает 1. Я хотел бы, чтобы это возвращало количество o.intorgnodeID (идентификаторы клиентов), в которых выражение case было истинным (57 клиентов).

Другими словами, я подозреваю, что часть «then 1» оператора case вызывает у меня проблемы. Но я не уверен, как изменить «1», чтобы подсчитывать только результаты исходного оператора case

 SELECT
    o.strDMANode --- AKA Metro Market
    ,case when(sum(case when (year(getdate()) - 1) * 12   month(getdate()) - ((year(sbi.dtmdelivered) - 1) * 12   month(sbi.dtmdelivered))  = 24 then 1 else 0 end)) >0 then 1 else 0 end as 'Current Month - 1' --- this is the output column that I hope to have return a value of '57'. Currently is returning a '1'
FROM sqlfact.dbo.uvwreport as sbi
    JOIN [sqlDim].[dbo].[uvwdimOrgNodeType1] o ON [sbi].[intDimOrgNodeID] = [o].[intDimOrgNodeID]
    JOIN [sqlDim].[dbo].[uvwdimProductType1] as "z" ON [sbi].[intDimProductPrimaryID] = [z].[intDimProductID]
WHERE 
    ([sbi].[intstatusid] = 5 OR sbi.intsubstatusid = 43) --- Includes only delivered reports
    and [sbi].[mnyDollarcost] > 0 --- NO $0 reports
    and [o].[bitCurrent] = 1 --- Excludes all historical versions of OrgNode, which were duplicates
    and [o].[strSalesRegionNodeGroup]  = 'Construction' 
GROUP BY [o].[strDMANode]
ORDER BY [o].[strDMANode] asc

 

ТЕКУЩИЕ РЕЗУЛЬТАТЫ:

 strDMANode               Result
ABILENE-SWEETWATER DMA 1               
 

ЖЕЛАЕМЫЕ РЕЗУЛЬТАТЫ:

 strDMANode Column        Result
ABILENE-SWEETWATER DMA   57
 

Ответ №1:

Я думаю, вы хотите case , чтобы в качестве аргумента sum() :

 sum(case when(case when (year(getdate()) - 1) * 12   month(getdate()) - ((year(sbi.dtmdelivered) - 1) * 12   month(sbi.dtmdelivered))  = 24 then 1 else 0 end)) >0 then 1 else 0 end) as 'Current Month - 1'
 

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

1. Итак, когда я пытаюсь использовать эту строку кода, я получаю сообщение об ошибке: Msg 4145, Level 15, State 1, Line 3 An expression of non-boolean type specified in a context where a condition is expected, near ')'.