![]() |
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. |
Re: Brauche SQL-Profi wegen einer Abfrage...
Code:
Gruß
[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 |
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 |
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. |
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 ? |
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ß, |
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) |
Re: Brauche SQL-Profi wegen einer Abfrage...
Zitat:
|
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. |
Re: Brauche SQL-Profi wegen einer Abfrage...
Damit wären wir (wiedermal) bei der Frage nach der verwendeten Datenbank angelangt: Welche Datenbank verwendest Du?
|
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 |
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ß |
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. |
Re: Brauche SQL-Profi wegen einer Abfrage...
Gefahr hat zugeschlagen- genau dieser Eindruck entsteht gerade bei mir...
|
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 |
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:
Aus diesen beiden Views kanns du dir dann ein Ergebnisset basteln:
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
SQL-Code:
Dabei geh ich klangheimlich davon aus, daß die Spalte Name eindeutig ist... Naja, so, oder so ähnlich sollte es funktionieren.
select k.Name, k.KaskoProv, s.SchutzProv
from vwKasko k full join vwSchutz s on k.Name = s.Name Gruß, |
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 |
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 ? |
Re: Brauche SQL-Profi wegen einer Abfrage...
Zitat:
Zitat:
|
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. |
Re: Brauche SQL-Profi wegen einer Abfrage...
Zitat:
Du legst 'ne Zwischentabelle an die Du dann hinterher wieder vernichtest :
SQL-Code:
Dann die Daten hinzufügen.
/*kommentar*/
create table tmpprovision (name varchar(50), monat varchar(2), kasko float, schutzbrief float) 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:
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.
select name, sum(kasko) as kasko, sum(schutzbrief) as schutzbrief, sum(kasko)+sum(schutzbrief) as total
from tmpprovision where monat = '01' group by name Ist zwar nicht besonders elegant, dafür sollte es aber funktionieren. MfG Lutz |
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:
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.
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 Gruß, |
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 ! |
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 07:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz