2009-05-20 9 views
4

Ich versuche, eine ziemlich komplizierte SELECT Berechnung zu tun, die ich verallgemeinern wird:Berechnete Spalte basiert auf zwei berechnete Spalten

  1. Hauptabfrage ein Platzhalter zu wählen ist für eine Tabelle
  2. Eine Unterabfrage hat eine COUNT() von alle Elemente auf der Grundlage einer Bedingung (das funktioniert gut)
  3. eine weitere Unterabfrage hat eine SUM() von Zahlen in einer Spalte auf einem anderen Zustand basiert. Dies funktioniert auch korrekt, außer wenn keine Datensätze die Bedingungen erfüllen, gibt es NULL zurück.

Ich wollte zunächst die beiden Subqueries addieren, so etwas wie (subquery1)+(subquery2) AS total der gut arbeitet, es sei denn subquery2 null ist, in welchem ​​Fall total null wird, unabhängig davon, was das Ergebnis subquery1 ist. Mein zweiter Gedanke war, zu versuchen, eine dritte Spalte zu erstellen, die eine Berechnung der zwei Unterabfragen sein sollte (dh (subquery1) AS count1, (subquery2) AS count2, count1+count2 AS total), aber ich denke nicht, dass es möglich ist, zwei berechnete Spalten zu berechnen, und selbst wenn es so wäre, fühle ich mich wie Das gleiche Problem gilt.

Hat jemand eine elegante Lösung für dieses Problem hat außerhalb von nur die beide Unterabfrage Werte bekommen und sie in meinem Programm in Höhe von?

Danke!

+0

Können Sie Einzelheiten angeben? Wie eine Beispielabfrage, die Sie erstellt haben. –

+0

Denken Sie auch an den COALESCE (SUM (CASE WHEN Zustand DANN 1 ELSE 0 ENDE), 0) Trick, um Elemente bedingungslos zu zählen: Sie können möglicherweise zwei Unterabfragen zu einem einzigen kombinieren oder sie in die Hauptabfrage rollen. – araqnid

Antwort

11

Zwei Fragen geht hier vor:

  • Sie können nicht eine Spalte Alias ​​in einem anderen Ausdruck in der gleichen SELECT-Liste verwenden.

    Allerdings können Sie Aliase in einer abgeleiteten Tabelle subquery aufzubauen und sie in einer äußeren Abfrage verwenden.

  • Sie können mit NULL keine Arithmetik ausführen, weil NULL nicht 0 ist.

    Sie können jedoch „default“ NULL auf einen Nicht-NULL-Wert unter Verwendung der COALESCE() Funktion. Diese Funktion gibt ihr erstes Nicht-NULL-Argument zurück.

Hier ein Beispiel:

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

(denken Sie daran, dass eine abgeleitete Tabelle eine Tabelle, alias, "t" in diesem Beispiel gegeben werden muß)

+0

FANTASTISCH, danke. Ich dachte nicht, COALESCE (Unterabfrage, 0) zu tun. Das ist ein toller Trick. – Jason

+0

Sie können auch die COALESCE() in jede Unterabfrage einfügen, indem Sie SUM() oder COUNT() umbrechen. Sechs von ein und ein halbes Dutzend von den anderen. –

1

Ich würde versuchen, (für die zweite Abfrage) so etwas wie: SELECT SUM (ISNULL (MyColumn, 0)) // Bitte überprüfen Syntax auf, dass, bevor Sie es benutzen, obwohl ...

Dies sollte 0 zurückgeben anstelle von null für jede Instanz dieser Spalte, die Null ist.

3

Zunächst einmal, die COALESCE-Funktion sollten Sie kümmern sich um irgendwelchen null Probleme nehmen helfen.

Könnten Sie eine Vereinigung verwenden, um diese zwei Abfragen in einer einzigen Ergebnismenge zu fusionieren, dann behandeln sie als eine Unterabfrage für die weitere Analyse?

Oder vielleicht habe ich Ihre Frage nicht vollständig verstanden?

+0

ich bin nicht vertraut mit UNION oder COALESCE, obwohl ich sie schon einmal gesehen habe ... ich denke, du verstehst richtig, da ich versuche, sie zu einer einzigen Ergebnismenge zusammenzuführen. könnte ich tun ((subquery1) + COALESCE (subquery2))? ... oder was – Jason

+0

genial ... COALESCE hat den Trick, obwohl die SQL-Zeichenfolge ist ziemlich lang und unhandlich, da ich die SUM() Unterabfrage zweimal wiederholen muss (jetzt 3 Unterabfragen als eine Spalte, oy) gibt es eine Möglichkeit, dies zu tun, ohne eine ganze Unterabfrage erneut zu wiederholen? – Jason

+0

COALESCE (Unterabfrage2, 0) - bedeutet Wert von Unterabfrage2 oder 0, wenn das null ist. – araqnid

0

Es könnte überflüssig sein zu sagen, aber Da Sie es in einem Programm verwenden, verwenden Sie lieber Programmlogik, um die beiden Ergebnisse (NULL und eine Zahl) aufgrund von Portabilitätsproblemen zu summieren.

Wer weiß, wann die COALESCE-Funktion veraltet ist oder ob ein anderes DBMS dies unterstützt oder nicht.