4 Stimmen

Berechnete Spalte basierend auf zwei berechneten Spalten

Ich versuche, eine ziemlich komplizierte SELECT Berechnungen, die ich verallgemeinern werde:

  1. Hauptabfrage ist ein Wildcard-Select für eine Tabelle
  2. Eine Unterabfrage führt eine COUNT() aller Artikel auf der Grundlage einer Bedingung (dies funktioniert problemlos)
  3. Eine weitere Unterabfrage führt eine SUM() von Zahlen in einer Spalte auf der Grundlage einer anderen Bedingung. Dies funktioniert auch korrekt, außer wenn keine Datensätze die Bedingungen erfüllen, gibt es NULL .

Ursprünglich wollte ich die beiden Unterabfragen addieren, etwa so (subquery1)+(subquery2) AS total was gut funktioniert, es sei denn, subquery2 ist null, in diesem Fall total null wird, unabhängig davon, was das Ergebnis von subquery1 ist. Mein zweiter Gedanke war, zu versuchen, eine dritte Spalte zu erstellen, die eine Berechnung der beiden Unterabfragen sein sollte (d.h., (subquery1) AS count1, (subquery2) AS count2, count1+count2 AS total ), aber ich glaube nicht, dass es möglich ist, zwei berechnete Spalten zu berechnen, und selbst wenn es möglich wäre, habe ich das Gefühl, dass das gleiche Problem besteht.

Hat jemand eine elegante Lösung für dieses Problem außerhalb von nur immer die zwei Subquery-Werte und summieren sie in meinem Programm?

Merci !

0 Stimmen

Können Sie Einzelheiten nennen? Wie einige Beispielabfragen, die Sie erstellt haben.

0 Stimmen

Denken Sie auch an den Trick COALESCE(SUM(CASE WHEN condition THEN 1 ELSE 0 END),0), um Elemente bedingt zu zählen: Sie können möglicherweise zwei Unterabfragen zu einer einzigen zusammenfassen oder sie in die Hauptabfrage integrieren.

11voto

Bill Karwin Punkte 493880

Hier geht es um zwei Dinge:

  • Sie können einen Spaltenalias nicht in einem anderen Ausdruck in derselben SELECT-Liste verwenden.

    Sie können jedoch Aliase in einer abgeleiteten Tabellenunterabfrage erstellen und sie in einer äußeren Abfrage verwenden.

  • Mit NULL kann man nicht rechnen, weil NULL ist nicht Null .

    Sie können jedoch NULL auf einen Nicht-NULL-Wert "voreinstellen", indem Sie die COALESCE() Funktion. Diese Funktion gibt ihr erstes Nicht-NULL-Argument zurück.

Hier ist 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 einer abgeleiteten Tabelle ein Tabellenalias gegeben werden muss, in diesem Beispiel "t")

0 Stimmen

FANTASTISCH, vielen Dank. Ich habe nicht daran gedacht, COALESCE(subquery, 0) zu verwenden. Das ist ein genialer Trick.

0 Stimmen

Sie könnten auch COALESCE() in jede Unterabfrage einfügen und die SUMME() oder ZAEHLUNG() umschließen. Sechs von der einen und ein halbes Dutzend von der anderen.

3voto

Goyuix Punkte 22754

Zunächst einmal sollte die Funktion COALESCE Ihnen helfen, eventuelle Null-Probleme zu beseitigen.

Könnten Sie eine Vereinigung verwenden, um diese beiden Abfragen zu einem einzigen Ergebnissatz zusammenzuführen, und diesen dann als Unterabfrage für die weitere Analyse behandeln?

Oder habe ich Ihre Frage vielleicht nicht ganz verstanden?

0 Stimmen

Ich bin nicht vertraut mit UNION oder COALESCE, obwohl ich sie vorher gesehen habe... ich denke, dass Sie richtig verstehen, wie ich versuche, sie in einen einzigen Ergebnissatz zu verschmelzen. könnte ich tun ((subquery1)+COALESCE(subquery2)) ... oder was

0 Stimmen

Fantastisch... COALESCE tat den Trick, obwohl die SQL-Zeichenfolge ziemlich lang und unhandlich ist, 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?

0 Stimmen

COALESCE(subquery2, 0) - bedeutet den Wert von subquery2, oder 0, wenn dieser gleich Null ist.

1voto

AllenG Punkte 8032

Ich würde (für die zweite Abfrage) etwas wie folgt versuchen: SELECT SUM(ISNULL(myColumn, 0)) //Bitte überprüfen Sie die Syntax, bevor Sie sie verwenden...

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

0voto

AbiusX Punkte 2271

Es ist vielleicht unnötig zu sagen, aber da Sie es innerhalb eines Programms verwenden, würden Sie lieber Programmlogik verwenden, um die beiden Ergebnisse (NULL und eine Zahl) zu summieren, aufgrund von Portabilitätsproblemen.

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

0 Stimmen

Und wer weiß schon, wann die Funktion der Programmlogik veraltet ist oder ob eine andere Programmiersprache sie unterstützt oder nicht. P.S. 10 Jahre später ist COALESCE immer noch nicht veraltet...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X