Coluna calculada com base em duas colunas calculadas
-
23-08-2019 - |
Pergunta
Estou tentando fazer um bastante complicado SELECT
cálculo que vou generalizar:
- A consulta principal é uma seleção curinga para uma tabela
- Uma subconsulta faz um
COUNT()
de todos os itens baseados em uma condição (isso funciona bem) - Outra subconsraia faz um
SUM()
de números em uma coluna baseada em outra condição. Isso também funciona corretamente, exceto quando nenhum registro atende às condições, ele retornaNULL
.
Eu inicialmente queria adicionar as duas subconsminadas, algo como (subquery1)+(subquery2) AS total
que funciona bem, a menos que o subquery2 seja nulo, nesse caso total
Torna -se nulo, independentemente do resultado do subquery1. Meu segundo pensamento era tentar criar uma terceira coluna que fosse um cálculo das duas subconsivas (ou seja, (subquery1) AS count1, (subquery2) AS count2, count1+count2 AS total
) Mas acho que não é possível calcular duas colunas calculadas e, mesmo que fosse, sinto que o mesmo problema se aplica.
Alguém tem uma solução elegante para esse problema fora de apenas obter os dois valores de subconstração e totalizando -os no meu programa?
Obrigado!
Solução
Duas questões acontecendo aqui:
Você não pode usar um alias de coluna em outra expressão na mesma lista de seleção.
No entanto, você pode estabelecer aliases em uma subconeração de tabela derivada e usá -los em uma consulta externa.
Você não pode fazer aritmética com nulo, porque Nulo não é zero.
No entanto, você pode "padrão" nulo para um valor não nulo usando o
COALESCE()
função. Esta função retorna seu primeiro argumento não nulo.
Aqui está um exemplo:
SELECT *, count1+count2 AS total
FROM (SELECT *, COALESCE((subquery1), 0) AS count1,
COALESCE((subquery2), 0) AS count2
FROM ... ) t;
(Lembre -se de que uma tabela derivada deve receber um alias de tabela, "t" neste exemplo)
Outras dicas
Primeiro, a função Coalesce deve ajudá -lo a cuidar de problemas nulos.
Você poderia usar um sindicato para mesclar essas duas consultas em um único conjunto de resultados e depois tratá -lo como uma subconsulta para análises adicionais?
Ou talvez eu não tenha entendido completamente sua pergunta?
Eu tentaria (para a segunda consulta) algo como: Selecione Sum (isNull (mycolumn, 0)) // Verifique a sintaxe antes de usá -la, no entanto ...
Isso deve retornar 0 em vez de nulo para qualquer instância dessa coluna sendo zero.
Pode ser desnecessário dizer, mas como você o está usando dentro de um programa, prefere usar a lógica do programa para somar os dois resultados (nulo e um número), devido a problemas de portabilidade.
Quem sabe quando a função Coalesce é descontinuada ou se outro DBMS suporta ou não.