Rainer Müller: Erstellte Variable direkt in Kalkulation weiter nutzen

Hallo,

ich versuche die Kalkulation meiner Werte direkt über eine SQL-Anweisung vorzunehmen. Ich stoppe aber bei einem Punkt. Alle Berechnungen klappen, aber wenn ich eine erst erstellte "Variable", wie hier "Angebot_Hersteller_Punkte" zur weiteren Kalkulation nutzen möchte, sagt mir PHPMYADMIN, dass diese Variable nicht existiert / es die Variable nicht kennt. Ergo auch nicht mit SUM weiterrechnen kann ...

CASE
WHEN `Angebot_Hersteller` <= 4 THEN `Angebot_Hersteller` * 10 - 10
ELSE 50
END AS `Angebot_Hersteller_Punkte`,

SUM(
`Angebot_Hersteller_Punkte` +
`Angebot_Gebrauchtware` * 20 +
) 
AS `Gesamtpunkte`

Wie kann ich das Problem umgehen und richtig lösen? Die Variable Angebot_Hersteller_Punkte brauche ich auch so zur Anzeige. Und einige Kalkulationen haben noch größere CASE Anweisungen. Es sähe also ziemlich blöd aus, wenn ich überall doppelt die CASE Anweisung hätte als Workaround. Also statt Variable dort nochmal alles einfügen. Das würde es aber schwer für die Wartung machen.

Ich verwende MariaDB

Gruß Rainer

akzeptierte Antworten

  1. Tach!

    ich versuche die Kalkulation meiner Werte direkt über eine SQL-Anweisung vorzunehmen. Ich stoppe aber bei einem Punkt. Alle Berechnungen klappen, aber wenn ich eine erst erstellte "Variable", wie hier "Angebot_Hersteller_Punkte" zur weiteren Kalkulation nutzen möchte, sagt mir PHPMYADMIN, dass diese Variable nicht existiert / es die Variable nicht kennt. Ergo auch nicht mit SUM weiterrechnen kann ...

    Das ist in deinem Fall keine Variable, sondern ein Alias. Die Reihenfolge, in der die Felder in der SELECT-Klausel angegeben sind, ist nicht zwangsläufig diejeinige, in der MySQL/MariaDB die Ergebnis-Inhalte ermittelt. Man kann sich also nicht auf einen Alias-Namen beziehen, und vor allem nicht davon ausgehen, dass der Wert bereits existiert. Erst im HAVING und ORDER BY sind die Aliasnamen verfügbar.

    dedlfix.

    1. Tag!

      D.h. es gibt keine andere Möglichkeit das Problem zu umschiffen, als die CASE-Anweisung nochmal 1 zu 1 an der Stelle zu übernehmen?

      Gruß Rainer

      1. Mit WITH solltest Du dein Ziel erreichen können.

        1. Ah, das wäre genau das gewesen, was ich brauche.

          Common Table Expression WITH was introduced in MariaDB 10.2.1.

          Leider ist das MariaDB eine Subversion tiefer bei mir und Plesk ist leider sehr anfällig bei Änderungen...

          Danke für die Antwort, werde es dann wohl etwas anders machen müssen!

          Gruß Rainer

          1. Du könntest die Berechnungen auch in eine VIEW auslagern.

            1. Hallo mitleser,

              so, oder über ein geschachteltes Statement. Das innere SELECT kann man als temporären View sehen.

              SELECT foo, SUM(foo)
              FROM (SELECT bar, CASE...END foo FROM ...)
              GROUP BY bar
              

              Weshalb male ich das rot an: es ist nicht korrekt, foo und SUM(foo) gleichzeitig zu nutzen. SUM(foo) setzt ein GROUP BY voraus, und eine im SELECT angegebene Spalte sollte entweder ein Gruppierschlüssel sein ODER aggregiert werden.

              Das Verrückte ist, dass mysql diesen Fehler nicht abweist, sondern einfach den Spaltenwert aus irgendeiner Zeile der Gruppe verwendet. D.h. der Wert von foo ist dann von der Sortierung der aggregierten Zeilen abhängig (eine Sortierung, die nicht aus dem ORDER BY kommt sondern aus der Art wie die Table gelesen wurde) und deshalb nicht klar definiert. Wenn du unbedingt einen Zufallsgenerator brauchst, gibt es einfachere und bessere...

              Rolf

              --
              sumpsi - posui - clusi