Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Alternative Spalte abfragen, wenn bestimmter Eintrag

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von watchdogg, 3 September 2014.

  1. watchdogg

    watchdogg Neuer Benutzer

    Hallo Forum,

    ich bin neu hier und beisse mir grad an einer SQL-Abfrage die Zähne aus:

    Ich habe die Tabelle DATEN. Es geht mir um 3 Spalten aus der Tabelle. AUFTRAG, HINWEIS, VERBRAUCH.

    Es gibt jetzt den Fall, dass die Spalte AUFTRAG die Zeichenkette 'RESTBUCHUNG' beinhalten kann.
    Wenn das so ist, interessiert mich die Spalte HINWEIS nicht.
    Andernfalls interessiert nur die Spalte HINWEIS.

    Was ich aber immer brauche ist die Spalte VERBRAUCH.
    Und zwar immer die Summe bei gleichem Wert in der Spalte 'AUFTRAG' oder beim Wert 'RESTBUCHUNG' in HINWEIS.

    Also brauche ich GROUP BY in Verbindung mit sum(VERBRAUCH).

    Wo ich mich schwer tue ist nun das Herunziehen von entweder der Spalte 'AUFTRAG' oder der Spalte 'HINWEIS' in Verbindung mit der Summe der Spalte 'VERBRAUCH'.

    Meine kläglichen Versuche sehen so aus:

    Code:
    SELECT CASE WHEN AUFT = 'RESTBUCHUNG ' THEN AUFT ELSE HIN END as EINTRAG, SUM(VERB) as METER
      FROM (SELECT AUFTRAG AS AUFT, HINWEIS AS HIN, VERBRAUCH AS VERB FROM DATEN)
      DATEN
    GROUP BY EINTRAG, METER
    Da kommt "Ungültiger Spaltenname 'EINTRAG'" / "Ungültiger Spaltenname 'METER'"

    Ich hoffe Ihr wisst was ich meine.
    Wie kann ich das Problem lösen?


    MfG watchdogg
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Falls ich Dirch richtig verstehe hast Du:

    Code:
    test=*# select * from watchdog ;
     auftrag | hinweis | verbrauch
    ---------+---------+-----------
     rest  | egal  |  10
     x  | foo  |  12
     y  | bla  |  13
     z  | foo  |  14
    (4 rows)
    
    und suchst

    Code:
    test=*# select info, sum(verbrauch) from (select case when auftrag = 'rest' then auftrag else hinweis end as info, verbrauch from watchdog) zwischentabelle group by info ;
     info | sum
    ------+-----
     foo  |  26
     bla  |  13
     rest |  10
    (3 rows)
    
     
  3. ukulele

    ukulele Datenbank-Guru

    Die Fehlermeldung bezieht sich auf deine beiden im GROUP BY genannten Spalten. "Meter" willst du im GROUP BY gar nicht haben denn das ist ja die aggregierte Spalte. "Eintrag" hingegen willst du schon haben, aber: "Eintrag" ist nur der Alias und der wird erst im Select "erzeugt", steht also im GROUP BY nicht zur Verfügung. Eine Lösung wäre ein "veraschachtelter" Select wo erst eine Abfrage die Spalte "Eintrag" erzeugt und eine weitere Abfrage diese Spalte für GROUP BY nutzt, siehe akretschmers Lösungs-Code. Alternativ kannst du auch die selbe CASE Anweisung in deinem GROUP BY nutzen:
    Code:
    SELECT    ( CASE WHEN AUFTRAG = 'RESTBUCHUNG ' THEN AUFTRAG ELSE HINWEIS END ) AS EINTRAG,
            SUM(VERBRAUCH) AS METER
    FROM    DATEN
    GROUP BY ( CASE WHEN AUFTRAG = 'RESTBUCHUNG ' THEN AUFTRAG ELSE HINWEIS END )
     
  4. watchdogg

    watchdogg Neuer Benutzer

    Mensch, seid ihr genial.

    Hier ist die Lösung mit WHERE-Klausel:

    Code:
    SELECT info, SUM(VERBRAUCH)
    FROM (SELECT CASE WHEN AUFTRAG='RESTBUCHUNG' THEN AUFTRAG ELSE HINWEIS END AS info, VERBRAUCH, DATUM FROM DATEN)
        AS TempTable
    WHERE YEAR(DATUM) = 2014
    GROUP BY info
    
    Vielen Dank.

    Gruß, watchdogg
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden