Eu desenvolvi uma consulta e nos resultados das três primeiras colunas que recebo NULL
. Como posso substituí-lo 0
?
Select c.rundate,
sum(case when c.runstatus = 'Succeeded' then 1 end) as Succeeded,
sum(case when c.runstatus = 'Failed' then 1 end) as Failed,
sum(case when c.runstatus = 'Cancelled' then 1 end) as Cancelled,
count(*) as Totalrun from
( Select a.name,case when b.run_status=0 Then 'Failed' when b.run_status=1 Then 'Succeeded'
when b.run_status=2 Then 'Retry' Else 'Cancelled' End as Runstatus,
---cast(run_date as datetime)
cast(substring(convert(varchar(8),run_date),1,4)+'/'+substring(convert(varchar(8),run_date),5,2)+'/' +substring(convert(varchar(8),run_date),7,2) as Datetime) as RunDate
from msdb.dbo.sysjobs as a(nolock) inner join msdb.dbo.sysjobhistory as b(nolock)
on a.job_id=b.job_id
where a.name='AI'
and b.step_id=0) as c
group by
c.rundate
sql
sql-server
Bhaskar Mishra
fonte
fonte
Respostas:
Quando você quiser substituir uma
null
coluna possivelmente por outra, use IsNull .Isso colocará um 0 em myColumn se for nulo em primeiro lugar.
fonte
Você pode usar os dois métodos, mas existem diferenças:
Comparando COALESCE () e ISNULL ():
A função ISNULL e a expressão COALESCE têm um objetivo semelhante, mas podem se comportar de maneira diferente.
Como ISNULL é uma função, ela é avaliada apenas uma vez. Como descrito acima, os valores de entrada para a expressão COALESCE podem ser avaliados várias vezes.
A determinação do tipo de dados da expressão resultante é diferente. ISNULL usa o tipo de dados do primeiro parâmetro, COALESCE segue as regras de expressão CASE e retorna o tipo de dados do valor com a maior precedência.
A capacidade NULL da expressão do resultado é diferente para ISNULL e COALESCE. O valor de retorno ISNULL é sempre considerado NOT NULLable (assumindo que o valor de retorno não seja nulo), enquanto COALESCE com parâmetros não nulos é considerado NULL. Portanto, as expressões ISNULL (NULL, 1) e COALESCE (NULL, 1), embora equivalentes, têm valores de anulabilidade diferentes. Isso faz diferença se você estiver usando essas expressões em colunas computadas, criando restrições de chave ou tornando o valor de retorno de um UDF escalar determinístico, para que possa ser indexado, conforme mostrado no exemplo a seguir.
- Essa instrução falha porque a PRIMARY KEY não pode aceitar valores NULL - e a nulidade da expressão COALESCE para col2 - é avaliada como NULL.
- Esta instrução é bem-sucedida porque a capacidade de nulidade da função - ISNULL avalia AS NOT NULL.
As validações para ISNULL e COALESCE também são diferentes. Por exemplo, um valor NULL para ISNULL é convertido em int, enquanto que para COALESCE, você deve fornecer um tipo de dados.
ISNULL usa apenas 2 parâmetros, enquanto COALESCE usa um número variável de parâmetros.
Se você precisar saber mais, aqui está o documento completo do msdn.
fonte
Com
coalesce
:Embora, em síntese
when condition then 1
, você possa mudar comsum
a mesma facilidade paracount
- por exemplo:(
Count(null)
retorna 0, enquantosum(null)
retorna nulo.)fonte
Quando você diz as três primeiras colunas, você quer dizer suas
SUM
colunas? Em caso afirmativo, adicioneELSE 0
suasCASE
declarações. ASUM
de umNULL
valor éNULL
.fonte
Uma maneira simples é
fonte
Quebra sua coluna neste código.
Talvez verifique por que você está recebendo nulos
fonte
Use
COALESCE
, que retorna o primeiro valor não nulo, por exemploDefinirá Succeeded como 0 se for retornado como
NULL
.fonte
Adicione um outro às suas instruções de caso para que elas sejam padronizadas como zero se a condição de teste não for encontrada. No momento, se a condição de teste não for encontrada, NULL está sendo passado para a função SUM ().
fonte
Se você estiver usando o Presto, o AWS Athena etc., não há função ISNULL (). Em vez disso, use:
fonte
o problema aqui é que, sem a instrução else, você receberá um Nulo quando o status de execução não for o status indicado na descrição da coluna. Adicionar algo ao Null resultará em Null, e esse é o problema desta consulta.
Boa sorte!
fonte
seguindo as respostas anteriores, eu estava perdendo o nome da minha coluna no banco de dados SQL do servidor, no entanto, seguir esta sintaxe me ajudou a manter o ColumnName também
fonte