Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   mehrere Spalten in Ergebnismenge (https://www.delphipraxis.net/171960-mehrere-spalten-ergebnismenge.html)

Hansa 4. Dez 2012 15:20

Datenbank: Firebird • Version: 2.5 • Zugriff über: FIBplus

mehrere Spalten in Ergebnismenge
 
Hi,

ich brauche für eine Statistik mehrere Datensätze, die allerdings aus mehreren zusammengefügt werden müssen. Beispiel : zu jedem Artikel existiert pro Monat ein Datensatz. Jetzt sollen die Datensätze 1 bis 12 in einer Zeile dargestellt werden können. Also ungefähr so :

Code:
Artikel 1 Mon1 Mon2 .. Mon12
Artikel 2 Mon1 Mon2 .. Mon12
Die Tabellen sind momentan so aufgebaut, dass jeweils nur die Monate existieren, die <> 0 sind, denn es kann vorkommen, dass nur 1 Monat relevant ist. Statt einzelne Monate könnte man ja auch 12 Monate pro Artikel mitschleppen, aber geht das auch anders ?

mkinzler 4. Dez 2012 15:25

AW: mehrere Spalten in Ergebnismenge
 
Nennt man Pivot

DeddyH 4. Dez 2012 15:29

AW: mehrere Spalten in Ergebnismenge
 
Oder auch Kreuztabelle.

Sir Rufo 4. Dez 2012 15:32

AW: mehrere Spalten in Ergebnismenge
 
Wenn du das Ergebnis als DataSet haben möchtest, dass du einfach an ein DBGrid bindest, dann musst du eine Pivot Abfrage erstellen (und hast pro Artikel auch 12 Monatswerte).

Du kannst aber auch ein StringGrid nehmen und dieses mit den Werten aus der normalen Abfrage füllen.

Kommt jetzt darauf an, was schneller und einfacher umzusetzen ist.

Hansa 4. Dez 2012 16:58

AW: mehrere Spalten in Ergebnismenge
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nach etwas weitersuchen und zusammenstückeln kriege ich jetzt mit dem hier :

Code:
SELECT (CASE MONAT WHEN 1 THEN UMSATZ ELSE 0 END) AS MON1,
       (CASE MONAT WHEN 2 THEN UMSATZ ELSE 0 END) AS MON2,
       (CASE MONAT WHEN 3 THEN UMSATZ ELSE 0 END) AS MON3,
       (CASE MONAT WHEN 4 THEN UMSATZ ELSE 0 END) AS MON4,
       (CASE MONAT WHEN 5 THEN UMSATZ ELSE 0 END) AS MON5,
       (CASE MONAT WHEN 6 THEN UMSATZ ELSE 0 END) AS MON6,
       (CASE MONAT WHEN 7 THEN UMSATZ ELSE 0 END) AS MON7,
       (CASE MONAT WHEN 8 THEN UMSATZ ELSE 0 END) AS MON8,
       (CASE MONAT WHEN 9 THEN UMSATZ ELSE 0 END) AS MON9,
       (CASE MONAT WHEN 10 THEN UMSATZ ELSE 0 END) AS MON10,
       (CASE MONAT WHEN 11 THEN UMSATZ ELSE 0 END) AS MON11,
       (CASE MONAT WHEN 12 THEN UMSATZ ELSE 0 END) AS MON12
FROM STAT WHERE ID_ART=2874423
das im Anhang. Wichtig ist schon mal, dass die Detail-Datensätze nicht untereinander sondern nebeneinhander angezeigt werden. Nur die Zeilen stimmen noch nicht. 3. Spalte steht auch in 3. Zeile usw. Was fehlt da noch ? Geht das nur mit CASE oder ist das Zufall ?

mkinzler 4. Dez 2012 17:05

AW: mehrere Spalten in Ergebnismenge
 
Sollte mit einem ähnlichen View lösbar sein
SQL-Code:
CREATE OR ALTER VIEW UMSATZPROMONAT(
    ARTIKEL,
    JAHR,
    JANUAR,
    FEBRUAR,
    MAERZ,
    APRIL,
    MAI,
    JUNI,
    JULI,
    AUGUST,
    SEPTEMBER,
    OKTOBER,
    NOVEMBER,
    DEZEMBER)
AS
  select
    Artikel as Artikel,
    Jahr as jahr,
    sum( Januar) as Januar,
    sum( Februar) as Februar,
    sum( Maerz) as Maerz,
    sum( April) as April,
    sum( Mai) as mai,
    sum( Juni) as juni,
    sum( Juli) as juli,
    sum( August) as august,
    sum( September) as september,
    sum( Oktober) as oktober,
    sum( November) as november,
    sum( Dezember) as dezember
  from
  (
    select
      Artikel as Artikel,
      Jahr as Jahr,
      iif( monat = 1, umsatz, 0) as Januar,
      iif( monat = 2, umsatz, 0) as Februar,
      iif( monat = 3, umsatz, 0) as Maerz,
      iif( monat = 4, umsatz, 0) as April,
      iif( monat = 5, umsatz, 0) as Mai,
      iif( monat = 6, umsatz, 0) as Juni,
      iif( monat = 7, umsatz, 0) as Juli,
      iif( monat = 8, umsatz, 0) as August,
      iif( monat = 9, umsatz, 0) as September,
      iif( monat = 10, umsatz, 0) as Oktober,
      iif( monat = 11, umsatz, 0) as November,
      iif( monat = 12, umsatz, 0) as Dezember
   from
    (
        select
            Artikel as Artikel,
            extract( year from datum) as jahr,
            extract( month from datum) as monat,
            sum( umsatz) as umsatz
        from
            umsatz
        group by
           1,2,3
            )

    )
    group by Artikel, Jahr
;

mkinzler 4. Dez 2012 17:09

AW: mehrere Spalten in Ergebnismenge
 
Zitat:

Zitat von Hansa (Beitrag 1194312)
Nach etwas weitersuchen und zusammenstückeln kriege ich jetzt mit dem hier :

3. Spalte steht auch in 3. Zeile usw. Was fehlt da noch ? Geht das nur mit CASE oder ist das Zufall ?

Es wird pro Monat ein Ergebnis geliefert, du musst noch eine Summe prio Jahr bilden

Hansa 4. Dez 2012 17:17

AW: mehrere Spalten in Ergebnismenge
 
Zitat:

Zitat von mkinzler (Beitrag 1194314)
du musst noch eine Summe pro Jahr bilden

Inwiefern Summe ? Ich will ja die Monate einzeln.

P.S.: mit dem View siehts schon richtig aus. Aber warum ein View ?

Furtbichler 4. Dez 2012 17:50

AW: mehrere Spalten in Ergebnismenge
 
Weil das hübscher ist. Oder auch:
Weil das eine klare Schnittstelle zwischen Darstellung (EXE) und Erzeugung (DB) schafft.
Du musst die EXE nicht aufbohren, wenn Du die View änderst (z.B. Daten aus einer anderen Tabelle etc.)
und Du kannst die Auswertung auch an anderer Stelle noch gebrauchen (DRY)

btw. geht nicht auch
Code:
select sum(iif(monat = 1, umsatz, 9 )) as Januar,
 ...

Hansa 4. Dez 2012 18:20

AW: mehrere Spalten in Ergebnismenge
 
Was nützt es mich, die EXE nicht ändern zu müssen, dafür aber die View bzw. die DB ? :shock: Oder andersrum gefragt : wie kann ich die View parametrisieren ? Geht IMHO nicht. Ich kann ja wohl schlecht am 1.1.2013 eine neue View anlegen, weil es dann auch Daten für 2013 gibt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:39 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz