Benutzer mit den meisten Antworten
Rechnende Abfrage mit GROUP BY

Frage
-
Hallo Zusammen,
nachfolgendes Problem bereitet mir gerade richtiges Kopfzerbrechen: Ich habe eine Tabelle, in der Zugänge bzw. Abgänge auf Konten verbucht werden. Folgendes Layout:
Index | Zugaenge | Abgaenge | Menge | Typ | Datum
Index ist der fortlaufende, eindeutige Primäschlüssel (Integer)
Zugaenge beinhaltet eine mehrdeutige Kontonummer (kein Index)
Abgaenge beinhaltet eine mehrdeutige Kontonummer (kein Index)
Menge ist ein Float mit der Menge, die ab- bzw. zugebucht wird
Typ beinhaltet ein Gut, welches ab- bzw. zugebucht wurde
Datum ist das Datum des BuchungsvorgangsWas ich nun benötige ist für ein bestimmtes Konto Zugänge - Abgänge gruppiert nach Typ und Datum BETWEEN zwei Daten. Nachfolgendes habe ich probiert, aber es funktioniert irgendwie nicht:
select Zugang, Typ, sum(Menge) - (select sum(Menge) from Bewegungen where Abgang = '4711' group by Typ) from Bewegungen where Zugang = '4711' group by Typ;
Die Abfrage nach einem Datum habe ich mir hierbei schon nicht mehr getraut. :-(
Hat jemand von euch einen Tipp für mich, wie ich das hier bewältigt bekomme?
Vorab vielen Dank für eure Hilfe,
GrüßeTheDude
Antworten
-
use tempdb go create table t1 ( iIndex int, Zugaenge varchar, Abgaenge varchar, Menge decimal(19,4), Typ varchar, Datum datetime ) go insert into t1 values(2,2,1,4,1,getdate()),(1,1,2,2,1,getdate()) go declare @typ int = 1 declare @konto int = 1 declare @interval_start datetime = '2010-01-01' declare @interval_end datetime = '2012-01-01' ;with t2 as ( select Zugaenge, Abgaenge, sum(Menge) as SumMenge from t1 where Typ = @typ and (Zugaenge = @konto or Abgaenge = @konto) and Datum between @interval_start and @interval_end group by grouping sets (Zugaenge,Abgaenge) ) select @konto Zugang, @typ Type, (t3.SumMenge - t2.SumMenge) as Menge from t2 inner join t2 t3 on t2.Abgaenge = t3.Zugaenge where t2.Abgaenge = @konto drop table t1 go
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 16. Februar 2011 07:48
-
Was ich (leider) vergessen habe zu schreiben ist, daß es sich bei meiner DB um eine SQLite-DB handelt und nicht um einen MS SQL-Server. Von daher denke ich, daß ich Deine Lösung nicht 1:1 umsetzen kann sondern erst einmal portieren muß. Aber es wird schon werden ... :-)
Hallo TheDude,
die erste Abfrage kann man wie folgt umschreiben:
select @konto Zugang, @typ Typ, ( select sum(Menge) from t1 where Typ = @typ and Zugaenge = @konto and Datum between @interval_start and @interval_end group by Zugaenge ) - ( select sum(Menge) from t1 where Typ = @typ and Abgaenge = @konto and Datum between @interval_start and @interval_end group by Abgaenge ) as Menge
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 16. Februar 2011 07:48
Alle Antworten
-
use tempdb go create table t1 ( iIndex int, Zugaenge varchar, Abgaenge varchar, Menge decimal(19,4), Typ varchar, Datum datetime ) go insert into t1 values(2,2,1,4,1,getdate()),(1,1,2,2,1,getdate()) go declare @typ int = 1 declare @konto int = 1 declare @interval_start datetime = '2010-01-01' declare @interval_end datetime = '2012-01-01' ;with t2 as ( select Zugaenge, Abgaenge, sum(Menge) as SumMenge from t1 where Typ = @typ and (Zugaenge = @konto or Abgaenge = @konto) and Datum between @interval_start and @interval_end group by grouping sets (Zugaenge,Abgaenge) ) select @konto Zugang, @typ Type, (t3.SumMenge - t2.SumMenge) as Menge from t2 inner join t2 t3 on t2.Abgaenge = t3.Zugaenge where t2.Abgaenge = @konto drop table t1 go
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 16. Februar 2011 07:48
-
Hallo Yury,
... das ist ... stark ... muß ich erst einmal verdauen. Vielen Dank für das Script!
Was ich (leider) vergessen habe zu schreiben ist, daß es sich bei meiner DB um eine SQLite-DB handelt und nicht um einen MS SQL-Server. Von daher denke ich, daß ich Deine Lösung nicht 1:1 umsetzen kann sondern erst einmal portieren muß. Aber es wird schon werden ... :-)
Vielen herzlichen Dank nochmals,
GrüßeTheDude
Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare. [Cicero, Philippica 12,2] -
Hi DudeLOL!Und weil Du bei SQLite keine Antwort gekriegt hast, hast Du es hier versucht. Hat vermutlich nicht viel genützt.Denn, ob das dann so 1:1 umsetzbar oder überhaupt migrierbar ist, wage ich zu bezweifeln, weil da viele SQL spezifische Dinge verwendet werden.^Das Ganze läuft erst ab SQL2008, 2005 kann keine mehrfach Inserts, kann keine Declares mit Wertzuweisungen und kennt keine Grouping Sets.Das alles kann auch SQLight nicht und es wird zudem das diesem Script zu Grunde liegende With Statement nichts anzufangen wissen.GrussHenry<TheDude69> wrote in message news:83058ad8-df47-495a-8828-85a071577089@communitybridge.codeplex.com...
Hallo Yury,
... das ist ... stark ... mu�? ich erst einmal verdauen. Vielen Dank für das Script!
Was ich (leider) vergessen habe zu schreiben ist, da�? es sich bei meiner DB um eine SQLite-DB handelt und nicht um einen MS SQL-Server. Von daher denke ich, da�? ich Deine Lösung nicht 1:1 umsetzen kann sondern erst einmal portieren mu�?. Aber es wird schon werden ... :-)
Vielen herzlichen Dank nochmals,
Grü�?eTheDude
Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare. [Cicero, Philippica 12,2] -
Was ich (leider) vergessen habe zu schreiben ist, daß es sich bei meiner DB um eine SQLite-DB handelt und nicht um einen MS SQL-Server. Von daher denke ich, daß ich Deine Lösung nicht 1:1 umsetzen kann sondern erst einmal portieren muß. Aber es wird schon werden ... :-)
Hallo TheDude,
die erste Abfrage kann man wie folgt umschreiben:
select @konto Zugang, @typ Typ, ( select sum(Menge) from t1 where Typ = @typ and Zugaenge = @konto and Datum between @interval_start and @interval_end group by Zugaenge ) - ( select sum(Menge) from t1 where Typ = @typ and Abgaenge = @konto and Datum between @interval_start and @interval_end group by Abgaenge ) as Menge
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 16. Februar 2011 07:48
-
Hallo Henry,
... na ja, so war es nicht ganz. Ich habe gegoogelt nach "SQL Forum deutsch" und bin dann hier gelandet. Später habe ich dann gesehen, daß sich das Forum hier eigentlich "nur" mit dem MS SQL-Server beschäftigt. Daher auch der Nachsatz in meiner Antwort an Yury wegen dem SQLite ... :-)
Also - sorry! War keine mutwillige Absicht.
Viele Grüße
TheDude
Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare. [Cicero, Philippica 12,2] -
Hallo Yury,
danke für Deine Hilfe und das Script. Ich werde versuchen, das auf die SQLite-DB anzuwenden. Vorher möchte ich jedoch diesen Ansatz auch verstehen ... :-)
Bin ein ziemlicher SQL-Neuling und arbeite mich gerade in die Materie ein. Das Stück Software, was ich gerade schreibe, benutzt SQL und auch das ist für mich Neuland ...
Viele Grüße
TheDude
Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare. [Cicero, Philippica 12,2] -
Hallo Dude
Hoffe, Du hast mich nicht falsch verstanden. War einfach lustig zu lesen, weil ich die SQL Syntax selber nochmals nachschlagen musste, um zu verstehen, was da Yuri Geniales zusammen gebaut hat.
Selbstverständlich bist Du hier auch als SQLight Neuling jederzeit herzlich willkommen. Vielleicht können wir Dich ja überzeugen, dass der SQL Server eine Alternative sein könnte und werden natürlich auch bei SQLight Fragen SQL Statements finden, die einfach genug sind, dass diese von SQLight interpretiert werden können.
Bis bald
Henry