Domanda

Sto cercando di fare un calcolo piuttosto complicato SELECT che io generalizzare:

  1. query principale è un jolly selezione per una tabella
  2. Una subquery fa un COUNT() di tutti gli elementi in base a una condizione (questo funziona bene)
  3. Un altro subquery fa un SUM() di numeri in una colonna sulla base di un'altra condizione. Questo funziona anche correttamente, eccetto quando nessun record soddisfano le condizioni, restituisce NULL.

Inizialmente ho voluto aggiungere le due sottoquery, qualcosa come (subquery1)+(subquery2) AS total che funziona bene a meno subquery2 è nullo, nel qual caso total diventa nullo, indipendentemente da ciò che il risultato di subquery1 è. Il mio secondo pensiero è stato quello di cercare di creare una terza colonna che doveva essere un calcolo dei due sottoquery (vale a dire, (subquery1) AS count1, (subquery2) AS count2, count1+count2 AS total) ma non credo che sia possibile calcolare due colonne calcolate, e anche se lo fosse, mi sento come il stesso problema si applica.

Qualcuno ha una soluzione elegante a questo problema al di fuori del solo ottenere i due valori sottoquery e li per un totale nel mio programma?

Grazie!

È stato utile?

Soluzione

Due questioni in corso qui:

  • Non è possibile utilizzare un alias di colonna in un'altra espressione nella stessa lista SELECT.

    Tuttavia, è possibile stabilire alias in una tabella di subquery derivata e utilizzarli in una query esterna.

  • Non si può fare aritmetica con NULL, perché NULL non è zero .

    Tuttavia, è possibile NULL "default" ad un valore non nullo usando la funzione COALESCE(). Questa funzione restituisce il suo primo argomento non NULL.

Ecco un esempio:

SELECT *, count1+count2 AS total
FROM (SELECT *, COALESCE((subquery1), 0) AS count1, 
                COALESCE((subquery2), 0) AS count2 
      FROM ... ) t;

(ricordiamo che una tabella derivata deve essere dato un alias di tabella, "t" in questo esempio)

Altri suggerimenti

Prima di tutto, la funzione COALESCE dovrebbe aiutare a prendersi cura di eventuali problemi nulli.

Hai bisogno di un sindacato per unire queste due query in un singolo set di risultati, quindi trattarla come una sottoquery per ulteriori analisi?

O forse non ho capito completamente la tua domanda?

Vorrei provare (per la seconda query) qualcosa come: SUM SELECT (ISNULL (MyColumn, 0)) // Si prega di verificare la sintassi su quella prima di usarla, anche se ...

Questo dovrebbe restituire 0 invece di null per qualsiasi istanza di quella colonna è zero.

Potrebbe essere inutile a dirsi, ma dal momento che lo si usa all'interno di un programma, si preferisce utilizzare la logica del programma per sommare i due risultati (NULL e un numero), a causa di problemi di portabilità.

Chi sa quando è deprecato funzione COALESCE o se un altro DBMS supporta o no.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top