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

Gruppierung, aber nur eine Summe

Dieses Thema im Forum "Oracle" wurde erstellt von drzwockel, 21 Januar 2015.

  1. drzwockel

    drzwockel Benutzer

    Hallo ins Forum,

    ich bin neu hier und hoffe, dass Ihr mit helfen könnt. Ich habe ein Auswerteprogramm in Excel geschrieben, dass seinen Datenbestand aus einer Oracle Datenbank holt. Dies funktioniert bisher einwandfrei.
    Die Ergebnisse werden immer gruppiert - summiert dargestellt, so dass für eine Abfragezeile immer summierte Monatswerte ausgegeben werden.

    Beispiel:
    Abfrage für alle roten Autos aus MS (als Beispiel), dann erfolgt die monatsweise Ausgabe für die Bedingung rote Autos und aus MS
    Jan: 10
    Feb: 16
    Mrz: 17
    usw...

    In der nächsten Zeile werden dann alle blauen Autos aus MS abgefragt usw.
    Jetzt aber zu meinem Problem. Ich muss jetzt Abfragen erstellen, die in einem Parameter einen Schlüssel abfragen, der mit Prozent übergeben werden darf. Dieser Schlüssel ist 16stellig. Die Übergabe könnte dann wie folgt aussehen:
    Alle blauen Autos mit dem Schlüssel LIKE '387%'

    Im SQL Developer bekomme ich dann meine Summen angezeigt nach dem Muster
    Jan: 3871111111111 Wert 2
    Jan: 3871231313131 Wert 7
    Jan: 3879842342342 Wert 1
    Feb: 3875400000090 Wert 2
    usw.

    Eine solche Ausgabe kann aber mein Auswertetool nicht verarbeiten, sondern die möglichen Schlüssel müssten zusammensummiert als Monatswert ausgebeben werden. Also hier z.Bsp. für Jan. 10 ... usw.
    Ich habe von einem Kollegen gehört, dass dies durchaus machbar sein soll (mit einer Pseudospalte).

    Jetzt meine Frage/Bitte: Hat jemand eine Lösung/einen Lösungsansatz, wie der SQL-String aufgebaut werden muss?

    Vielen Dank,

    Gruß vom Doc
     
  2. ukulele

    ukulele Datenbank-Guru

    Es wäre gut, wenn du die zugrundeliegende Abfrage mit posten würdest. Dein SQL Developer müsste ja sowas machen wie
    Code:
    SELECT Monat,Schlüssel,count(*) AS Anzahl
    FROM tabelle
    WHERE Schlüssel LIKE '387%'
    GROUP BY Monat,Schlüssel
    und das könnte man eventuell abändern in
    Code:
    SELECT Monat,left(Schlüssel,3) AS Schlüssel,count(*) AS Anzahl
    FROM tabelle
    WHERE Schlüssel LIKE '387%'
    GROUP BY Monat,left(Schlüssel,3)
     
  3. Distrilec

    Distrilec Datenbank-Guru

    Code:
    SELECT Monat, listagg(Schlüssel, ',') AS Schlüssel,count(*) AS Anzahl
    FROM tabelle
    WHERE Schlüssel LIKE '387%'
    GROUP BY Monat
    Sollte wohl besser sein... Oder ?
     
  4. drzwockel

    drzwockel Benutzer

    Hallo an Alle,

    vielen Dank für Eure Antworten ... es wurde die Frage nach dem String gestellt, hier ist er (modifiziert):

    SELECT
    YYYYMM,
    AVG(STUNDEN) AS A_STUNDEN,
    SCHLUESSEL,
    TYP
    FROM
    MUSTERDATENBANK
    WHERE
    ORG = '1000'
    AND SCHLUESSEL LIKE '387%'
    AND TYP = 'PKW'
    AND YYYYMM BETWEEN '201400' AND '201412'
    GROUP BY
    YYYYMM,
    SCHLÜSSEL,
    TYP
    ORDER BY
    YYYYMM;

    Als Wert soll dann der Stundenwert (AVG) pro YYYYMM herauskommen. Würde der Schlüssel hier eindeutig sein, wäre dies kein Problem. Leider wird diese Abfragemöglichkeit gewünscht :-(.

    Ich hoffe, dass es jetzt etwas verständlicher geworden ist.


    Gruß vom Doc
     
  5. Distrilec

    Distrilec Datenbank-Guru

    Code:
    Select yyyymm,
           Avg(stunden) As a_stunden,
           listagg(schluessel, ','),
           typ
    From   musterdatenbank
    Where  org = '1000'
    And    schluessel Like '387%'
    And    typ = 'PKW'
    And    yyyymm Between '201400' And '201412'
    Group  By yyyymm,
              typ
    Order  By yyyymm;
    
    So sollte das "funktionieren"... Deine Anforderung ist mir immer noch zu schwammig... Willst du denn überhaupt alle Schlüssel angezeigt bekommen ?
     
  6. drzwockel

    drzwockel Benutzer

    Hallo Distrilec,

    erst einmal vielen Dank für Deine schnelle Hilfe.

    Jetzt zu Deiner Frage - eine knappe Antwort: Nein

    Es geht bei dieser Abfrage lediglich um das AVG(Stunden) Ergebnis entsprechend der gestellten Bedingungen aus der WHERE Klausel.
    Also für Jan: zum Beispiel 100, da ist es egal, welche Schlüssel daran beteiligt waren (sie müssen nur mit 387 ... beginnen oder eben in einer anderen Abfragekonstellation mit einer anderen Schlüsseldarstellung (Bsp.: 4568%).


    Gruß vom Doc
     
  7. drzwockel

    drzwockel Benutzer

    Hallo Distrlec,

    ich bekomme jetzt immer diese Fehlermeldung im SQL-Developer:

    ORA-02000: fehlendes WITHIN Schlüsselwort
    02000. 00000 - "missing %s keyword"
    Fehler in Zeile: 37 Spalte: 30

    Bezieht sich auf die Zeile "listagg(...)

    Gruß vom Doc
     
  8. Distrilec

    Distrilec Datenbank-Guru

    Hups.... Ja...

    Da hab ich wohl was vergessen :D
    Code:
    Select yyyymm,
           Avg(stunden) As a_stunden,
           listagg(schluessel, ',') within group (order by schluessel asc),
           typ
    From   musterdatenbank
    Where  org = '1000'
    And    schluessel Like '387%'
    And    typ = 'PKW'
    And    yyyymm Between '201400' And '201412'
    Group  By yyyymm,
              typ
    Order  By yyyymm;
    Aber da dir die Schlüssel egal sind, kannst du die Spalte auch wegfallen lassen :)
     
    drzwockel gefällt das.
  9. drzwockel

    drzwockel Benutzer

    Hallo Distrilec,

    super :)

    Genau das habe ich gesucht ... prima schnelle Hilfe und geniale Lösung.


    Gruß vom Doc
     
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