Ergebnis 1 bis 9 von 9

Thema: SQL Ergebnis in mehreren Zeilen

  1. #1
    Kreakworld ist offline Neuer Benutzer
    Registriert seit
    30.09.2009
    Beiträge
    2

    Standard SQL Ergebnis in mehreren Zeilen

    Hallo Postgre-Community,
    ich hab mich ma eben angemeldet, weil ich Probleme mit einer Anforderung habe.

    In der Tabelle sind Buchungssätze hinterlegt. Also Buchung 400 Euro auf Konto XXX im Soll.

    Ich will aus diesen Datensätzen...:
    ----------------------------------
    Code:
    HAUPK     BUDAT     DMBET     SOHAB
    11111     2001-x     300         S
    11111     2001-x     150         H
    11111     2001-x     100         S
    11111     2001-x     350         H
    ...folgende Ausgabe erziehlen:
    ----------------------------------
    Code:
    HAUPK     JAHR     SOLL     HABEN
    11111      2001     400,00   500,00
    ...statt dessen habe ich dieses Ergebnis:
    ----------------------------------
    Code:
    HAUPK     JAHR     SOLL     HABEN
    11111     2001     400,00   0
    11111     2001     0          500,00
    Spaltendefinitionen:
    ----------------------------------
    Code:
    Feldname     Typ     Länge     Kommentar
    HAUPK         CHAR   11         Sachkonto-(nummer)
    SOHAB         CHAR   1          Soll-/Habenkennzeichen (H oder S)
    DMBET         DEC     17 ,2     Betrag dieser Buchung
    BUDAT         CHAR   10         Buchungsdatum (2001-10-23)
    die Spalten in der Where Klausel sind weitesgehend uninteressant und grenzen den Ergebnisbereich aufs gewünschte ein.

    Es geht um folgende kleine Abfrage:

    ---------------------------
    Code:
    SELECT
        HAUPK AS SACHKONTO,
    CASE 
        WHEN SOHAB = 'S' 
            THEN -SUM(DMBET) 
        END AS SOLLJAHR,
    CASE 
        WHEN SOHAB = 'H' 
            THEN SUM(DMBET)
        END AS HABENJAHR
    FROM tabelle
    WHERE 
        KNZNR='1' AND
        MANDA='01' AND
        WERKE='  ' AND
        BUCHS LIKE '501' AND
        BUDAT LIKE '2001%'
    GROUP BY
        HAUPK, SOHAB
    ORDER BY
        HAUPK
    ---------------------------

    die spalte "SOLLJAHR" soll negativ dargestellt werden, darum das '-' vor SUM... funktioniert auch wie gewünscht!

    Ich müsste die Gruppierung nach SOHAB rausnehmen.. dann unterscheidet er nicht mehr nach dem SOHAB-Kennzeichen... wenn ich es aus der GROUP-BY Klausel raus nehme kommt der Fehler : "ORA-00979 Kein GROUP-BY Ausdruck".

    Die Datenbank ist eine Oracle 10.2.

    Vielen Dank für eure Hilfe, ich bin fast sicher es gibt eine einfache Lösung!

    Gruß
    Kreakworld

  2. #2
    symbiont ist offline Erfahrener Benutzer
    Registriert seit
    17.03.2008
    Ort
    NULL
    Beiträge
    1.320

    Standard hmm

    Code:
    /* create table dings (
    	haupk char(11),
    	sohab char(1),
    	dmbet numeric(10, 2),
    	budat char(10)
    )*/
    
    select d.haupk, d.budat as jahr, 
    	(select sum(dmbet) from dings s where s.haupk = d.haupk and s.budat =d.budat and sohab='S') as soll,
    	(select sum(dmbet) from dings s where s.haupk = d.haupk and s.budat =d.budat and sohab='H') as haben
    from dings d
    group by d.haupk, d.budat
    "11111 ";"2001-x ";400.00;500.00

  3. #3
    Kreakworld ist offline Neuer Benutzer
    Registriert seit
    30.09.2009
    Beiträge
    2

    Standard

    besten dank!! hatte viele doppelte ergebnisse aber mit DISTINCT siehts gut aus!

    ich werd warscheinlich die nächsten tage öfters mal was fragen wenn ich nicht ganz weiter weiss

    gruß & dank
    kreakworld

  4. #4
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von Kreakworld Beitrag anzeigen
    Hallo Postgre-Community,
    ich hab mich ma eben angemeldet, weil ich Probleme mit einer Anforderung habe.

    In der Tabelle sind Buchungssätze hinterlegt. Also Buchung 400 Euro auf Konto XXX im Soll.

    Ich will aus diesen Datensätzen...:
    ----------------------------------
    Code:
    HAUPK     BUDAT     DMBET     SOHAB
    11111     2001-x     300         S
    11111     2001-x     150         H
    11111     2001-x     100         S
    11111     2001-x     350         H
    ...folgende Ausgabe erziehlen:
    ----------------------------------
    Code:
    HAUPK     JAHR     SOLL     HABEN
    11111      2001     400,00   500,00
    ...statt dessen habe ich dieses Ergebnis:
    ----------------------------------
    Code:
    HAUPK     JAHR     SOLL     HABEN
    11111     2001     400,00   0
    11111     2001     0          500,00
    Spaltendefinitionen:
    ----------------------------------
    Code:
    Feldname     Typ     Länge     Kommentar
    HAUPK         CHAR   11         Sachkonto-(nummer)
    SOHAB         CHAR   1          Soll-/Habenkennzeichen (H oder S)
    DMBET         DEC     17 ,2     Betrag dieser Buchung
    BUDAT         CHAR   10         Buchungsdatum (2001-10-23)
    die Spalten in der Where Klausel sind weitesgehend uninteressant und grenzen den Ergebnisbereich aufs gewünschte ein.

    Es geht um folgende kleine Abfrage:

    ---------------------------
    Code:
    SELECT
        HAUPK AS SACHKONTO,
    CASE 
        WHEN SOHAB = 'S' 
            THEN -SUM(DMBET) 
        END AS SOLLJAHR,
    CASE 
        WHEN SOHAB = 'H' 
            THEN SUM(DMBET)
        END AS HABENJAHR
    FROM tabelle
    WHERE 
        KNZNR='1' AND
        MANDA='01' AND
        WERKE='  ' AND
        BUCHS LIKE '501' AND
        BUDAT LIKE '2001%'
    GROUP BY
        HAUPK, SOHAB
    ORDER BY
        HAUPK
    ---------------------------

    die spalte "SOLLJAHR" soll negativ dargestellt werden, darum das '-' vor SUM... funktioniert auch wie gewünscht!

    Ich müsste die Gruppierung nach SOHAB rausnehmen.. dann unterscheidet er nicht mehr nach dem SOHAB-Kennzeichen... wenn ich es aus der GROUP-BY Klausel raus nehme kommt der Fehler : "ORA-00979 Kein GROUP-BY Ausdruck".

    Die Datenbank ist eine Oracle 10.2.

    Vielen Dank für eure Hilfe, ich bin fast sicher es gibt eine einfache Lösung!

    Gruß
    Kreakworld

    1. ist das hier kein Oracle-Forum, sondern eins für PostgreSQL.
    2. verwendest Du kranke Datentypen. Es gibt DATE, das kann man anstelle von char(irgendwas) verwenden und kann dann damit auch richtig rechnen.
    3. das, was Du willst, geht auch ohne Subselects (symbiont)

    Code:
    test=*# select * from dings ;
        haupk    | sohab | dmbet  | budat
    -------------+-------+--------+-------
     11111       | S     | 300.00 |
     11111       | H     | 150.00 |
     11111       | S     | 100.00 |
     11111       | H     | 350.00 |
    (4 rows)
    
    test=*# select haupk, sum(case when sohab='S' then dmbet else 0 end) as soll, sum(case when sohab='H' then dmbet else 0 end) as haben from dings group by haupk;
        haupk    |  soll  | haben
    -------------+--------+--------
     11111       | 400.00 | 500.00
    (1 row)
    Auf das Jahr hab ich mal verzichtet weil das hier sicherlich irrelevant ist.


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  5. #5
    symbiont ist offline Erfahrener Benutzer
    Registriert seit
    17.03.2008
    Ort
    NULL
    Beiträge
    1.320

    Standard

    naja - so oder so - siehts nicht besonders schoen aus

    wie du schon sagst - kranke datentypen - und bloedes modell

    sohab koennte man weglassen und dafuer gleich zwei spalten - eine soll und eine haben einfuehren ..

    noch besser - zwei tabellen - eine soll und eine haben .. der buchungswert wird NOT NULL

    das macht vieles einfacher
    Geändert von symbiont (30.09.2009 um 14:35 Uhr)

  6. #6
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von symbiont Beitrag anzeigen
    naja - so oder so - siehts nicht besonders schoen aus

    wie du schon sagst - kranke datentypen - und bloedes modell

    sohab koennte man weglassen und dafuer gleich zwei spalten - eine soll und eine haben einfuehren ..

    das macht vieles einfacher
    Ja. Und verbraucht mehr Platz. Man könnte auch SOLL negativ speichern. Aber möglicherweise gibt es Anforderungen, auch z.B. negative Haben-Buchungen zu ermöglichen. (wenn ich mir die Hypo Real Estate anschaue, glaube ich ganz sicher, daß die sowas brauchen...).

    Unanhängig davon, Deine Lösung brauch 2 Gänge durch die Tabelle, und das nenne ich dann halt mal blöde Lösung, nicht nur optisch.


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #7
    symbiont ist offline Erfahrener Benutzer
    Registriert seit
    17.03.2008
    Ort
    NULL
    Beiträge
    1.320

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    Unanhängig davon, Deine Lösung brauch 2 Gänge durch die Tabelle, und das nenne ich dann halt mal blöde Lösung, nicht nur optisch.


    Andreas
    Nagut .. ist auch ne Info .. dass das aber 2 Durchgaenge braucht liegt nur an Postgres Ein Durchgang würde theoretisch auch reichen ..

    ich weiss ich weiss ... ich verlange diesmal zuviel *g*
    Geändert von symbiont (30.09.2009 um 14:49 Uhr)

  8. #8
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von symbiont Beitrag anzeigen
    Nagut .. ist auch ne Info .. dass das aber 2 Durchgaenge braucht liegt nur an Postgres Ein Durchgang würde theoretisch auch reichen ..
    2 Subselects mit unterschiedlichen WHERE-Bedingungen?

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  9. #9
    symbiont ist offline Erfahrener Benutzer
    Registriert seit
    17.03.2008
    Ort
    NULL
    Beiträge
    1.320

    Standard

    diese aufgabe ist schwierig aber nich unmoeglich

    postgres kennt die korelation der subselekts -> die sind gleich
    postgres kennt die from tableexpresseion -> gleich
    usw.

    diese subselects liesen sich zusammenfassen - bei einem scan koennten dann beide agregate bedient werden - je nach bedingung ..

    an anderen stellen passieren solche dinge ja auch

    ich denke das problem ist einfach zu speziell, als das man da gross rumoptimieren wollte ... es sei denn irgendeiner hat mal lange weile

    und wie du schon jezeicht hast - man kanns auch anders loesen
    Geändert von symbiont (30.09.2009 um 15:47 Uhr)

Ähnliche Themen

  1. Frage Such nach mehreren Verknüpfungen
    Von made im Forum SQL
    Antworten: 1
    Letzter Beitrag: 24.03.2011, 17:07
  2. mehrere zeilen als ergebnis einer perlfunktion
    Von gnoerz im Forum Prozedurale Sprachen
    Antworten: 10
    Letzter Beitrag: 15.12.2008, 16:00
  3. Triggern mit mehreren Tabellen
    Von netzwerg im Forum Trigger und Funktionen
    Antworten: 1
    Letzter Beitrag: 28.10.2008, 15:24
  4. tabelle in mehreren tablespaces?
    Von myre im Forum Allgemeines
    Antworten: 2
    Letzter Beitrag: 04.03.2008, 16:21
  5. Antworten: 10
    Letzter Beitrag: 11.09.2007, 14:54

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum