springstil
Goto Top

GROUP BY verketten? MSSQL 2016

Hallo zusammen,

Ich hole mir aus Datev eine Salden liste raus, diese Importiere ich in die Datenbank um sie erst einmal so zu verändern / bearbeiten wie ich sie für unser ERP brauche. (Ich weiß das unsere Buchhaltung etwa eigenartig arbeitet, aber es funktioniert :P )

Mein abfrage sieht so aus:

SELECT top 100
	datevImport.Personenkonto, 
	datevImport.Belegnummer, 
	min(datevImport.Belegdatum) as Belegdatum, 
	min(datevImport.[Fälligkeitsdatum]) as [Fälligkeitsdatum], 
	sum (cast(datevImport.[Restbetrag Soll] as numeric(10,2))) as [Restbetrag Soll], 
	sum (cast(datevImport.[Restbetrag Haben] as numeric(10,2))) as [Restbetrag Haben] , 
	datevImport.Referenzbelegnummer, 
	datevImport.Buchungstext
FROM
	dbo.datevImport 
	
	GROUP BY
	datevImport.Personenkonto,
	datevImport.Belegnummer,
	datevImport.Referenzbelegnummer, 
	datevImport.Buchungstext

Ich darf hier keine Doppelten Belegnummern haben! Allerdings versuche ich auch die Referenzbelegnummer und Buchungstext mit zunehmen. Diese Texte sind aber unterschiedlich und daher greift hier das Group BY nicht mehr. Nun wäre meine Idee das ich die Felder einfach "zusammen" lege also Verkette mit einander wenn
datevImport.Personenkonto,
datevImport.Belegnummer,
übereinstimmt.

Nur weiß ich nicht ob das überhaupt möglich ist. Hat vielleicht jemand ne idee?

Content-ID: 2748997563

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

Ausgedruckt am: 21.11.2024 um 19:11 Uhr

ukulele-7
Lösung ukulele-7 11.05.2022 um 15:32:39 Uhr
Goto Top
Du suchst quasi ein GROUP_CONCAT (MySQL etc.) in MSSQL. In neueren Versionen geht das mit ARRAY_AGG(), 2016 müsste dazu gehören. Ansonsten geht das in MSSQL mit einer XML-Funktion, nicht ganz so selbsterklärend:
https://stackoverflow.com/questions/46661496/how-to-use-group-concat-fun ...
ukulele-7
ukulele-7 11.05.2022 um 15:34:25 Uhr
Goto Top
PS: Was meinst du mit "darfst keine doppelten Belegnummern haben", du meinst du kannst auch hier nicht aggregieren wenn die unterschiedlich sind oder?
Springstil
Springstil 11.05.2022 um 17:01:27 Uhr
Goto Top
Zitat von @ukulele-7:

PS: Was meinst du mit "darfst keine doppelten Belegnummern haben", du meinst du kannst auch hier nicht aggregieren wenn die unterschiedlich sind oder?

Daher ja das Group By damit ich aus Restbetrag soll und haben eine summe bekomme. und immer das kleinste Datum (Was dem Eigentlichen Rechnungsdatum gleicht) bekomme.

Nach langem hin und her ist jetzt dabei raus gekommen das wir die Texte nicht im ERP brauchen. Somit hat sich das eigendlich erledigt, aber des Spaßes halbe versuche ich das mal wie du sagtest. Danke face-smile
Springstil
Springstil 16.05.2022 um 08:54:30 Uhr
Goto Top
Zitat von @ukulele-7:

Du suchst quasi ein GROUP_CONCAT (MySQL etc.) in MSSQL. In neueren Versionen geht das mit ARRAY_AGG(), 2016 müsste dazu gehören. Ansonsten geht das in MSSQL mit einer XML-Funktion, nicht ganz so selbsterklärend:
https://stackoverflow.com/questions/46661496/how-to-use-group-concat-fun ...

Danke noch mal für den Tipp, habs dann hinbekommen face-smile
Ich poste das mal für den fall das jemand ein ähnliches Problem hat:

SELECT
             DI.Kontonummer AS Personenkonto, 
             DI.[Rechnungs-Nr], 
             MIN(DI.[Rechnungsdatum]) AS Belegdatum, 
             MIN(DI.[Fälligkeit]) AS [Fälligkeitsdatum], 
             SUM( CAST(DI.[Betrag Soll] AS numeric(10,2))) AS [Restbetrag Soll], 
             SUM( CAST(DI.[Betrag Haben] AS numeric(10,2))) AS [Restbetrag Haben],
             STUFF((  
                    SELECT ',' + datevImport.[Buchungstext]  
                    FROM datevImport WHERE DI.[Rechnungs-Nr] = datevImport.[Rechnungs-Nr] 
                    FOR XML PATH('')  
             ), 1, 1, '') AS Buchungstext  
FROM datevImport AS DI
WHERE 
             DI.Kontonummer BETWEEN '10000' AND '69999'  
                GROUP BY
                DI.Kontonummer,
                DI.[Rechnungs-Nr]
ukulele-7
ukulele-7 16.05.2022 um 09:27:03 Uhr
Goto Top
Die Lösung wähle ich auch regelmäßig weil meine Instanzen fast alle noch SQL 2014 haben.