creamycewie
Goto Top

T-SQL Gruppieren-Summieren

Hallo.

Ich habe eine SQL-Abfrage, mit der Ich mir mehrere Werte aus zwei Tabellen hole.

Mein Makro sieht so aus:

select 
		p.Artikelnummer as Artikel, 
		p.Menge as Menge,
		a._ARA1010 as Ara1,
		a._ARA1020 as Ara2,
		a._ARA1031 as Ara3,
		a._ARA1032 as Ara4,
		a._ARA1041 as Ara5,
		a._ARA1042 as Ara6,
		a._ARA1043 as Ara7,
		a._ARA1044 as Ara8,
		a._ARA1045 as Ara9,
		a._ARA1046 as Ara10,
		a._ARA1047 as Ara11,
		a._ARA2010 as Ara12,
		a._ARA2020 as Ara13,
		a._ARA2031 as Ara14,
		a._ARA2032 as Ara15,
		a._ARA2041 as Ara16,
		a._ARA2042 as Ara17,
		a._ARA2050 as Ara18,
		a._ARA2060 as Ara19,
		a._ARA2070 as Ara20,
		a._ARA2080 as Ara21,
		a._ARA2090 as Ara22,
		a._ARA2100 as Ara23,
		a._ARA2110 as Ara24,
    a._ARAGRUPPE as AraGruppe,
        (:Tarif_1_01_0) as 'Tarif 1',  
        (:Tarif_1_02_0) as 'Tarif 2',  
        (:Tarif_1_03_1) as 'Tarif 3',  
        (:Tarif_1_03_2) as 'Tarif 4',  
        (:Tarif_1_04_1) as 'Tarif 5',  
        (:Tarif_1_04_2) as 'Tarif 6',  
        (:Tarif_1_04_3) as 'Tarif 7',  
        (:Tarif_1_04_4) as 'Tarif 8',  
        (:Tarif_1_04_5) as 'Tarif 9',  
        (:Tarif_1_04_6) as 'Tarif 10',  
        (:Tarif_1_04_7) as 'Tarif 11',  
        (:Tarif_2_01_0) as 'Tarif 12',  
        (:Tarif_2_02_0) as 'Tarif 13',  
        (:Tarif_2_03_1) as 'Tarif 14',  
        (:Tarif_2_03_2) as 'Tarif 15',  
        (:Tarif_2_04_1) as 'Tarif 16',  
        (:Tarif_2_04_2) as 'Tarif 17',  
        (:Tarif_2_05_0) as 'Tarif 18',  
        (:Tarif_2_06_0) as 'Tarif 19',  
        (:Tarif_2_07_0) as 'Tarif 20',  
        (:Tarif_2_08_0) as 'Tarif 21',  
        (:Tarif_2_09_0) as 'Tarif 22',  
        (:Tarif_2_10_0) as 'Tarif 23',  
        (:Tarif_2_11_0) as 'Tarif 24'  
		
	from belegp 
		as p
	inner join ART 
		as a 
			on a.Artikelnummer = p.Artikelnummer
	where p.Belegtyp = 'R' and Datum >= :Von_Datum and Datum <= :Bis_Datum  

Die Abfrage funktioniert, ich bekomme nun eine Auflistung aller Datensätze samt den Werten.

Nun habe ich 2 Fragen bzw. Probleme.

1.) Ich muss nun div. Felder aufsummieren.
Ich brauche also nun die Summe aller "Ara1" Datensätze, die Summe aller "Ara2"-Datensätze usw.
würde ich Prinzipiell mit "SUM" hinbekommen, was jedoch zu Problem 2 führt:

2.) Ich brauche diese Summierung gruppiert.
In den Einzelnen DS ist das Feld "AraGruppe" befüllt.
Dies kann verscheidene Werte enthalten, z.B. AT1, AT2, AT3, ...

Wie muss ich mein Statement umbauen?

Zur Veranschaulichung, wir haben eine Ergebnissmenge die foglend aussieht:
~Artikel ~Menge ~AraGruppe ~Ara1 ~Ara2 ~Ara3 ~Ara4 ~Ara5
pp1000 600 AT 20a 0,015 0,106 0,005
pp1003 60 AT 20a 0,015 0,106 0,008
pp1006 60 AT 20a 0,014 0,095 0,011
pp1050 600 AT 20a 0,015 0,106 0,005
pp1050 1200 AT 20a 0,015 0,106 0,005
pp1200 1200 AT 17 0,015 0,106 0,005
pp1200 1200 AT 17 0,015 0,106 0,005
pp1200 1200 AT 17 0,015 0,106 0,005
pp2000 300 AT 19 0,015 0,106 0,008
pp2000 600 AT 19 0,015 0,106 0,008
pp2001 120 AT 19 0,015 0,106 0,005
pp2002 1200 AT 19 0,016 0,106 0,008
Gerechnet werden soll immer:
Menge * ARA1
Menge * ARA2
Menge * ARA3
usw.

Jedoch brauche ich diese Rechnung pro AraGruppe.

Wie wäre dies zu realisieren?

Lieben Dank!

Content-ID: 376670

Url: https://administrator.de/contentid/376670

Ausgedruckt am: 26.11.2024 um 22:11 Uhr

sabines
sabines 11.06.2018 um 10:44:47 Uhr
Goto Top
Moin,

was spricht dagegen dein SQL Statement mit group by zu erweitern/anzupassen?

Gruss
CreamyCewie
CreamyCewie 11.06.2018 um 11:23:59 Uhr
Goto Top
Wenn ich es mit Group by anpasse, muss ich jede Spalte entweder gruppieren oder aggregieren.
Dies ist jedoch nicht möglich, da die Werte (zB in den Feldern a._ARA_1010 usw) immer unterschiedlich sind, und auch sein müssen.
Wenn ich mit den Werten rechne, verfälsche ich das ergebniss.
emeriks
emeriks 11.06.2018 um 11:32:34 Uhr
Goto Top
Hi,
ich glaube, Du hast einen Denkfehler in Deiner eigenen Anforderung.
Wenn Du nach "AraGruppe" die "Menge" summieren willst - wo willst Du das dann hinschreiben? In jede einzelne Zeile eines Artikels aus dieser Gruppe? Weil die anderen Felder unterscheiden sich doch auch, z.B. "Ara1" für "pp1006" und "pp1050", welche beide in Gruppe "AT 20a" sind. Ergo musst Du eh neu selektieren und kannst nur die Summe von "Menge" in Abhängigkeit von nur "AraGruppe" darstellen. Oder?

E.
em-pie
em-pie 11.06.2018 aktualisiert um 11:46:46 Uhr
Goto Top
Moin,

Mache doch zwei Statements und verkette die mit einem Inner join.

Das erste Statement beinhaltet deine relevanten Felder aus einzelnen Datensätzen.
Im zweiten Statement machst du deine relevanten zu aggregierenden Felder und schlüssel ist dann (vermutlich) die Spalte "AraGruppe" (!?).

SELECT 
 a.AraGruppe
 , a.field1_1
 , a.field1_2
 , a.field1_3
 , a.field1_4 * b.Sum2_1
 , a.field1_4 * b.Sum2_1
FROM
 Table1 as a
INNER JOIN
 (SELECT AraGruppe, SUM(field2_1) as Sum2_1, MAX(field2_2) as Max2_2, MIN(field2_3) FROM Table2 GROUP BY AraGruppe) as b on a.AraGruppe = b.AraGruppe
WHERE
 Hase=Igel

Du müsstest dir nur die richtigen Felder dann noch auswählen und einsetzen

Gruß
em-pie
ukulele-7
ukulele-7 11.06.2018 um 11:58:20 Uhr
Goto Top
Dein SQL scheint massiv gegen die Normalisierung zu verstoßen. Ich würde sagen durch die redundanten Spalten machst du dir dein Leben selber schwer. Mit sum() kannst du keine Spalten aufaddieren, nur Zeilen. Daher wirst du mit a._ARA1010 + a._ARA1020... arbeiten oder deine Daten normalisieren müssen.

Das mit dem gruppieren "verschlimmert" dann ggf. die Probleme, daher wäre ich für eine Änderung der Tabelle und die Auslagerung der Werte Ara1 bis N in eine eigene Tabelle.