none
Rechnende Abfrage mit GROUP BY RRS feed

  • 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 Buchungsvorgangs

    Was 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üße

    TheDude

    Mittwoch, 9. Februar 2011 15:29

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	
    
    
    Mittwoch, 9. Februar 2011 16:27
  • 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
    
    Donnerstag, 10. Februar 2011 09:33

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	
    
    
    Mittwoch, 9. Februar 2011 16:27
  • 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üße

    TheDude


    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare. [Cicero, Philippica 12,2]
    Donnerstag, 10. Februar 2011 07:39
  • Hi Dude
     
    LOL!
     
    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.
     
    Gruss
    Henry

    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ü�?e

    TheDude


    Cuiusvis hominis est errare, nullius nisi insipientis in errore perseverare. [Cicero, Philippica 12,2]
    Donnerstag, 10. Februar 2011 08:03
  • 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
    
    Donnerstag, 10. Februar 2011 09:33
  • 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]
    Donnerstag, 10. Februar 2011 10:04
  • 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]
    Donnerstag, 10. Februar 2011 10:08
  • 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

    Freitag, 11. Februar 2011 05:07