Pergunta

Estou tentando fazer um bastante complicado SELECT cálculo que vou generalizar:

  1. A consulta principal é uma seleção curinga para uma tabela
  2. Uma subconsulta faz um COUNT() de todos os itens baseados em uma condição (isso funciona bem)
  3. 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 retorna NULL.

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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top