Colonna calcolata sulla base di due colonne calcolate
-
23-08-2019 - |
Domanda
Sto cercando di fare un calcolo piuttosto complicato SELECT
che io generalizzare:
- query principale è un jolly selezione per una tabella
- Una subquery fa un
COUNT()
di tutti gli elementi in base a una condizione (questo funziona bene) - 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, restituisceNULL
.
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!
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.