Frage

Ich versuche es ziemlich kompliziert zu machen SELECT Berechnung, die ich verallgemeinern werde:

  1. Die Hauptabfrage ist eine Platzhalterauswahl für eine Tabelle
  2. Eine Unterabfrage führt Folgendes aus: COUNT() aller Artikel basierend auf einer Bedingung (das funktioniert gut)
  3. Eine andere Unterabfrage führt a aus SUM() von Zahlen in einer Spalte basierend auf einer anderen Bedingung.Dies funktioniert auch korrekt, es sei denn, es wird zurückgegeben, wenn kein Datensatz die Bedingungen erfüllt NULL.

Ich wollte zunächst die beiden Unterabfragen addieren, so etwas wie (subquery1)+(subquery2) AS total was gut funktioniert, es sei denn, subquery2 ist null, in diesem Fall total wird null, unabhängig vom Ergebnis von Unterabfrage1.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 dies der Fall wäre, besteht meiner Meinung nach das gleiche Problem.

Hat jemand eine elegante Lösung für dieses Problem, außer einfach die beiden Unterabfragewerte abzurufen und sie in meinem Programm zu summieren?

Danke!

War es hilfreich?

Lösung

Hier gibt es zwei Probleme:

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

    Sie können jedoch Aliase in einer Unterabfrage einer abgeleiteten Tabelle einrichten und diese in einer äußeren Abfrage verwenden.

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

    Sie können NULL jedoch mithilfe von auf einen Nicht-NULL-Wert „voreinstellen“. 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 zugewiesen werden muss, in diesem Beispiel „t“).

Andere Tipps

Zunächst sollte die Koalesce -Funktion Ihnen helfen, sich um Nullprobleme zu kümmern.

Könnten Sie eine Gewerkschaft verwenden, um diese beiden Abfragen in ein einzelnes Ergebnissatz zusammenzufassen und sie dann als Unterabfrage für die weitere Analyse zu behandeln?

Oder habe ich Ihre Frage nicht vollständig verstanden?

Ich würde versuchen (für die zweite Abfrage) Etwas wie: Summe Summe (isnull (mycolumn, 0)) // Bitte überprüfen Sie die Syntax darauf, bevor Sie es verwenden, aber ...

Dies sollte 0 anstelle von Null zurückgeben, wenn eine Instanz dieser Spalte Null ist.

Es mag unnötig sein zu sagen, aber da Sie es in einem Programm verwenden, verwenden Sie lieber die Programmlogik, um die beiden Ergebnisse (Null und eine Zahl) aufgrund von Portabilitätsproblemen zu summieren.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top