Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Brauche SQL-Profi wegen einer Abfrage... (https://www.delphipraxis.net/28561-brauche-sql-profi-wegen-einer-abfrage.html)

Killerloop 26. Aug 2004 13:35


Brauche SQL-Profi wegen einer Abfrage...
 
Hallo !

Ich habe folges problem

Die Tabelle

lftndr : Name : provision : netto : monat
---------------------------------------------
1. : hans : 50 : 100 : 01
2. : tom : 20 : 200 : 01
3. : klaus : 10 : 20 : 01
4. : hans : 150 : 30 : 01
5. : hans : 20 : 10 : 01
6. : klaus : 50 : 140 : 02
7. : tom : 55 : 10 : 02
8. : hans : 25 : 10 : 02
9. : tom : 10 : 100 : 02

etwas verschoben hier, aber ich hoffe man erkennt was gemeint ist.

ich will eine SQL-Abfrage machen in der die einzelnen namen aufgelistet werden und mir zusammengerechnet wird wieviel provision
klaus,hans und tom im monat 01 hatten. dabei soll jeder der namen nur ein mal auf der liste auftauschen, (hätte ich jetzt mit select distinct gemacht) aber ich brauche trotzdem die gesamtprovision von z.B. tom im hans 02.

Die endtabelle müsste dan für monat 01 so aussehen:


Name : provision : netto : Gesamt

Hans 220 : 140 : 360
Klaus 10 : 20 : 30
Tom 20 : 200 : 220

Mein problem ist jetzt der hans. er hat im monat 01 3 mal provision kassiert, darf aber in der endabrechnung nur 1 mal auftauchen und alle 3 datensätze von ihm werden aber addiert.

Ich hoffe mir kann jemand helfen, ich komm da net weiter.

Leuselator 26. Aug 2004 13:40

Re: Brauche SQL-Profi wegen einer Abfrage...
 
Code:
  [b]SELECT[/b] name
       , [b]sum[/b](provision) AS ProviSumme
       , [b]sum[/b](netto)    AS NettoSumme
       , [b]count[/b](name)   AS AnzahlZahlungen
       , monat
    [b]FROM[/b] lftndr
[b]GROUP BY[/b] name,monat
Gruß

Union 26. Aug 2004 13:44

Re: Brauche SQL-Profi wegen einer Abfrage...
 
Es müsste so aussehen wenn Du nur einen Monat haben möchtest:

SQL-Code:
select Name,
   sum(provision) as Provision,
   sum(netto) as Netto,
   sum(provision+Netto) as Gesamt
from provision
group by monat,name having monat = 1

Killerloop 26. Aug 2004 14:06

Re: Brauche SQL-Profi wegen einer Abfrage...
 
Oh... Ah... es lebt. es bewegt sich. jetzt muss nur noch ein join mit rein weil das ja alles nur ein vereinfachtes bespiel war.

Die Realität ist viel härter. :? Das ganze Geschoss geht über 3 Tabellen.

Aber das Prinzip ist klar.

Danke euch erstmal.

Killerloop 26. Aug 2004 15:03

Re: Brauche SQL-Profi wegen einer Abfrage...
 
nein, doch nicht so klar. Ich brauch noch etwas hilfe.

die tabelle ändert sich etwas. und zwar um 1 feld. Das Feld "ART".

dork kann entweder KASKO oder SCHUTZBRIEF drinstehen.

lftndr:Name:provision:monat:art
---------------------------------------------
1. : hans : 50 : 01 :kasko
2. : tom : 20 : 01 :kasko
3. : klaus : 10 : 01 :Schutzbrief
4. : hans : 150 : 01 :kasko
5. : hans : 20 : 01 :schutzbrief
6. : klaus : 50 : 02:kasko
7. : tom : 55 : 02 :schutzbrief
8. : hans : 25 : 02 :kasko
9. : tom : 10 : 02 :schutzbrief

ok ,jetzt soll als ergebniss wie bereits oben angesprochen jeder name nur EINMAL in der endliste auftauchen,

die endliste sollte dieses format haben

lfdnr: name : provision KASKO : Provision SCHUTZBRIEF : Gesamt
1 hans : 225 : 20 : 245
2 tom : 20 : 65 : 85
3 klaus: 50 : 10 : 60

wobei ich festlegen möchte für welchen monat das ganze gelten soll. hier wäre es jetzt für monat 01 & 02.

ziemlich verzwickte sache. Ich hab schon in büchern und tutorials gekämpft, aber das ist mir fast zu knifflig. kann mir jemand helfen bei dieser geschichte ?

Jelly 26. Aug 2004 15:14

Re: Brauche SQL-Profi wegen einer Abfrage...
 
Hallo,

was du da vor hast geht nicht in einem Ruck. Du kannst in SQL keine Zeileninformationen in Spalten wiedergeben. Je nach DBS kannst du aber noch eventuell Stored Procedures in Erwägung ziehen.

Gruß,

angos 26. Aug 2004 15:28

Re: Brauche SQL-Profi wegen einer Abfrage...
 
Wieso nicht: Müsste doch mit

select Name,
sum(if(Art='KASKO', Provision, 0)) as KaskoProv,
sum(if(Art='SCHUTZBRIEF', Provision, 0)) as SchutzProv
from provision
where (monat >= :MonatVon)
and (Monat <= :MonatBis)
group by monat,name

funktionieren (ungetestet, aber ähnliches Problem hab ich so schonmal gelöst)

Jelly 26. Aug 2004 16:11

Re: Brauche SQL-Profi wegen einer Abfrage...
 
Zitat:

Zitat von angos
Wieso nicht:

Stimmt, so könnts klappen, falls denn der if-Konstrukt von der Datenbank unterstützt wird.

Killerloop 26. Aug 2004 16:58

Re: Brauche SQL-Profi wegen einer Abfrage...
 
nein, if geht nicht. ok, eigentlich muss es nicht unbedingt alles in einer query sein, aber ich muss einen quickreport machen der halt am ende so aussieht wie beschrieben und da wäre alles in einer einzigen query natürlich das günstigste.

Ist e smöglich aus mehreren querys einen quickreport zusammenzuflicken ? oder ist davon abzuraten ?
danke euch trotzdem für eure tips.

Leuselator 26. Aug 2004 18:20

Re: Brauche SQL-Profi wegen einer Abfrage...
 
Damit wären wir (wiedermal) bei der Frage nach der verwendeten Datenbank angelangt: Welche Datenbank verwendest Du?

Killerloop 26. Aug 2004 18:25

Re: Brauche SQL-Profi wegen einer Abfrage...
 
Das ganze fusst auf einer .mdb datei. also einer access DB. Gut wird bestimmt seine nachteile haben, aber jetzt isses passiert und ich muss irgendwie damit klarkommen. Irgendwie muss es gehen.

ich bin weiterhin für alle tips (ausser der migration der DB in eine anderes format :wink: ) aufgeschlossen.

Danke

Leuselator 26. Aug 2004 18:26

Re: Brauche SQL-Profi wegen einer Abfrage...
 
Dann bliebe Dir noch der Weg, eine Temporäre Tabelle anzulegen, diese mit den Werten zu füllen, den Report auf diese Tabelle laufen zu lassen und anschliessend die temporäre Tabelle zu löschen...
Gruß

Killerloop 26. Aug 2004 18:30

Re: Brauche SQL-Profi wegen einer Abfrage...
 
Hm, auch auf die gefahr hin das sich der eindruck aufdrängt ich bin zu faul zum probieren und will andere mein zeug proggen lassen, frage ich trotzdem mal ganz frech:

Wie sähe das in meinem Beispiel aus ?

Könnte man das kurz skizzieren ? Ich wäre wirklich sehr dankbar.

Leuselator 26. Aug 2004 18:37

Re: Brauche SQL-Profi wegen einer Abfrage...
 
Gefahr hat zugeschlagen- genau dieser Eindruck entsteht gerade bei mir...

Killerloop 26. Aug 2004 18:45

Re: Brauche SQL-Profi wegen einer Abfrage...
 
kann ich verstehen, aber wenn man wie ich noch am anfang steht mit einem haufen (ziemlich trockener bücher) dann ist man über jede hilfe dankbar. Da hilft halt wie in meinem Fall einfach nur Fragen fragen fragen und ausprobieren. Aber ich komm hier wirklich nicht weiter. Trotzdem vielen Dank. Und solltest Du es dir anders überlegen... :wink:

Ciao

Jelly 26. Aug 2004 19:38

Re: Brauche SQL-Profi wegen einer Abfrage...
 
Hallo,

du kannst z.B. die Abfrage von Angos oben bischen abändern, und in einer View speichern... Etwa so:

SQL-Code:
create view vwKasko as
select Name, sum(Provision) as KaskoProv
from provision
where (monat >= :MonatVon)
and (Monat <= :MonatBis) and (Art = 'KASKO')
group by name

create view vwSchutz as
select Name, sum(Provision) as SchutzProv
from provision
where (monat >= :MonatVon)
and (Monat <= :MonatBis) and (Art = 'SCHUTZBRIEF')
group by name
Aus diesen beiden Views kanns du dir dann ein Ergebnisset basteln:
SQL-Code:
select k.Name, k.KaskoProv, s.SchutzProv
from vwKasko k full join vwSchutz s on k.Name = s.Name
Dabei geh ich klangheimlich davon aus, daß die Spalte Name eindeutig ist... Naja, so, oder so ähnlich sollte es funktionieren.

Gruß,

Killerloop 26. Aug 2004 19:53

Re: Brauche SQL-Profi wegen einer Abfrage...
 
Ja, das klingt einleuchtend. Ich werd es testen spätestens wenn es nicht klappt komm ich zurück und jammere. :wink:

Vielen Dank schonmal !

Ciao

Killerloop 26. Aug 2004 21:58

Re: Brauche SQL-Profi wegen einer Abfrage...
 
Nein ! Es ist zum heulen. Access unterstützt natürlich keinen full join. ARGHHH!!!

Ich wage kaum zu fragen ob es da einen workaround gibt ?

Jelly 26. Aug 2004 23:44

Re: Brauche SQL-Profi wegen einer Abfrage...
 
Zitat:

Zitat von Killerloop
Access unterstützt natürlich keinen full join.

Probier mal "full outer join"...

Zitat:

Zitat von Killerloop
ARGHHH!!!

Nicht aufregen... Trink ein :cheers: und morgen blickst du wieder durch :lol:

Killerloop 27. Aug 2004 06:10

Re: Brauche SQL-Profi wegen einer Abfrage...
 
Es kann nicht wahr sein... ACCESS unterstützt tatsächlich keine Full (outer) joins.

Hab in einigen ACCESS foren gesucht, ich bin nicht der einizige mit diesem Problem.

Aber eine Antwort wie man das umgehen kann, einen Workaround , hab ich nicht gefunden.

Ich kann es einfach nicht glauben...

Falls jemand eine Idee hat... ich bin für alles offen.

lume96 27. Aug 2004 07:31

Re: Brauche SQL-Profi wegen einer Abfrage...
 
Zitat:

Zitat von Killerloop
Falls jemand eine Idee hat... ich bin für alles offen.

Ich hab eine :mrgreen:

Du legst 'ne Zwischentabelle an die Du dann hinterher wieder vernichtest :

SQL-Code:
/*kommentar*/
create table tmpprovision
(name varchar(50),
monat varchar(2),
kasko float,
schutzbrief float)
Dann die Daten hinzufügen.
für die Kasko :
SQL-Code:
/*Kommentar*/
insert into tmpprovision
select name, monat, sum(provision),0
from test2 
where art='kasko'
group by name, monat

und jetzt für den Schutzbrief :
SQL-Code:
/*Kommentar*/
insert into tmpprovision
select name, monat, 0, sum(provision)
from test2
where art='schutzbrief'
group by name, monat

und nun das Ganze auslesen :
SQL-Code:
select name, sum(kasko) as kasko, sum(schutzbrief) as schutzbrief, sum(kasko)+sum(schutzbrief) as total
from tmpprovision
where monat = '01'
group by name
am Ende dann 'nen "drop table tmpprovision" wenn Du den Quickreport erstellt hast. Kannst die Tabelle sonst auch einfach nur löschen "delete from tmpprovision", dann brauchst Du sie beim nächsten Quickreport nicht erst wieder anlegen.

Ist zwar nicht besonders elegant, dafür sollte es aber funktionieren.

MfG
Lutz

Jelly 27. Aug 2004 08:00

Re: Brauche SQL-Profi wegen einer Abfrage...
 
Hallo,

naja, das mit dem Temporären Tabellen ist so ne Sache, die extremely langsam wird bei größeren Datenmengen... Zumindest bei Access. Mit MSSQL kannst du die temp. Tabellen im RAM halten, was die Sache vertretbar macht, aber nicht bei Access...

Es gibt aber womöglich noch ne Möglichkeit, über Umwegen. Nimm dir meine 2 Views von oben, und ergänz dein Schlussresultset duch folgende Abfrage:

Delphi-Quellcode:
select k.Name, k.KaskoProv, s.SchutzProv
from Provision p left join vwSchutz s on p.Name = s.Name,
Provision p left join vwKasko k on p.Name = s.Name
Damit arbeitest du mit 3 Tabellen. Wichtig ist ja, daß du alle Namen aus Provision kriegst, und nicht nur die mit Schutz oder nur mit Kasko (XOR). Daher der left join auf Provision, der dir auf jeden Fall alle Namen liefert. Habs aber so nicht probiert.

Gruß,

Killerloop 27. Aug 2004 10:21

Re: Brauche SQL-Profi wegen einer Abfrage...
 
ich werd mal die Methode probieren mit den temporären tabellen. geschwindigkeit ist nicht so das problem, sind ja keine 1000 datensätze die da durchrauschen. Mal sehen.

Danke euch alle nochmals !

Schönes WoE !

Killerloop 30. Aug 2004 15:07

Re: Brauche SQL-Profi wegen einer Abfrage...
 
So, ich wollte nur mitteilen das es funktioniert hat. Danke euch. Ich hab es jetzt mit einem Mix aus temporären tabellen und wirren abfragen hinbekommen. :-)

Ohne dieses Forum wäre ich wahrscheinlich daran verzweifelt.

Vielleicht kann ich ja, irgendwann in ferner Zukunft, auch mal jemandem hier helfen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:59 Uhr.

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