Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

SQL Query mit Join, aufsummieren aber vorher negative Werte bestimmen

Frage Entwicklung Datenbanken

Mitglied: cmeese

cmeese (Level 1) - Jetzt verbinden

01.02.2014, aktualisiert 02.02.2014, 1934 Aufrufe, 3 Kommentare, 1 Danke

Hallo zusammen,
leider fällt es mir etwas schwer mein Problem kurz und knapp im Titel zu beschreiben.

Gegeben seien folgende 2 Tabellen:

Tabelle: Auftrag
01.
|-----------|-------|--------|----------| 
02.
|AuftragsID | Kunde | Blabla | Blubblub | 
03.
|-----------|-------|--------|----------| 
04.
|123456     | 134   | Text   | Text     | 
05.
|123457     | 134   | Text   | Text     | 
06.
|123458     | 134   | Text   | Text     | 
07.
|123459     | 134   | Text   | Text     | 
08.
|-----------|-------|--------|----------|
Tabelle: RechnungGutschrift
01.
|-----------|--------|------------|--------|----| 
02.
|AuftragsID | Betrag | Datum      | Nummer | Art| 
03.
|-----------|--------|------------|--------|----| 
04.
|123456     | 30500  | 01.01.2014 | 56781  | RE | 
05.
|123456     | 24500  | 01.01.2014 | 56782  | RE | 
06.
|123456     |  5000  | 01.01.2014 | 56783  | RE | 
07.
|123456     |  1000  | 01.01.2014 | 56784  | G  | 
08.
|123457     |  4380  | 01.01.2014 | 56782  | RE | 
09.
|123458     | 25460  | 01.01.2014 | 54323  | RE | 
10.
|123459     | 19870  | 01.01.2014 | 65634  | RE | 
11.
|-----------|--------|------------|--------|----|
Wenn ich nun die beiden Tabellen Joine und mir nur den Auftrag '123456' anzeigen lasse, erhalte ich folgendes Ergebnis:
01.
SELECT * FROM auftrag LEFT JOIN rechnunggutschrift ON auftrag.auftragsid = rechnunggutschrift.auftragsid WHERE auftrag.auftragsid = '123456' 
02.
 
03.
|-----------|-------|--------|----------||-----------|--------|------------|--------|----| 
04.
|AuftragsID | Kunde | Blabla | Blubblub ||AuftragsID | Betrag | Datum      | Nummer | Art| 
05.
|-----------|-------|--------|----------||-----------|--------|------------|--------|----| 
06.
|123456     | 134   | Text   | Text     ||123456     | 30500  | 01.01.2014 | 56781  | RE | 
07.
|123456     | 134   | Text   | Text     ||123456     | 24500  | 01.01.2014 | 56782  | RE | 
08.
|123456     | 134   | Text   | Text     ||123456     |  5000  | 01.01.2014 | 56783  | RE | 
09.
|123456     | 134   | Text   | Text     ||123456     |  1000  | 01.01.2014 | 56784  | G  | 
10.
|-----------|-------|--------|----------||-----------|--------|------------|--------|----|
Soweit schön und gut. Allerdings möchte ich nur eine Zeile pro Projekt zurück gegeben bekommen. Und zwar sollen die Rechnungsbeträge einfach aufsummiert werden. Im Prinzip ja einfach zu machen mit 'OUTER APPLY' und 'GROUP BY' und 'SUM(betrag)'. Das Problem ist jetzt das man die Beträge nicht einfach aufsummieren kann sondern berücksichtigen muss das auch Gutschriften in der Tabelle eingetragen sind. Also müsste man zuerst bei der Zeile wo 'art' = 'g' den 'betrag' negieren.

Wie kann ich also nun die Tabelle 'rechnunggutschrift' so dazu joinen das ich nur eine Zeile bekomme in der alle Werte aus 'betrag' addiert wurden aber berücksichtig wird das Zeilen mit 'art' = 'g' negativ sind, obwohl dort kein Vorzeichen eingetragen ist?

Das Ergebnis müsste ja so aussehen:
01.
|-----------|-------|--------|----------||--------| 
02.
|AuftragsID | Kunde | Blabla | Blubblub || Betrag | 
03.
|-----------|-------|--------|----------||--------| 
04.
|123456     | 134   | Text   | Text     || 59000  |    
05.
|-----------|-------|--------|----------||--------|
Würde mich sehr freuen wenn mich einer auf die richtige Spur setzt!
Mitglied: colinardo
LÖSUNG 01.02.2014, aktualisiert 03.02.2014
Hallo cmeese,
könnte man mit zwei SUB-SELECTS lösen welche die Summen für die Rechnungen und Gutschriften bildet, und die Gutsschriftsumme dann von den Rechnungen abzieht:
SELECT a.AuftragsID, a.Kunde, a.BlaBla, a.Blubblub, ( 
   SELECT SUM(r.Betrag)  
   FROM RechnungGutschrift r 
   WHERE r.AuftragsID = a.AuftragsID AND r.Art = 'RE' 
)-( 
   SELECT SUM(r.Betrag)  
   FROM RechnungGutschrift r 
   WHERE r.AuftragsID = a.AuftragsID AND r.Art = 'G' 
) AS Betrag 
FROM Auftrag a 
WHERE a.AuftragsID = '123456'
Grüße Uwe
Bitte warten ..
Mitglied: cmeese
02.02.2014 um 11:35 Uhr
Hallo Uwe,

vielen Dank für deine schnelle Hilfe.
Jetzt wo du es so schön hingeschrieben hast ist es ja recht logisch!

Habe nach mehreren Stunden probieren einfach nicht mehr den richtigen Weg gesehen. Vielen Dank für die Hilfe!
Bitte warten ..
Mitglied: Biber
03.02.2014, aktualisiert um 11:36 Uhr
Moin cmeese und colinardo,

würde es nicht auch mit einem Subselect reichen?

 
SELECT a.AuftragsID, a.Kunde, a.BlaBla, a.Blubblub 
 , ( SELECT SUM( Case r.Art  
               When 'RE', r.Betrag 
               when  'G', -r.Betrag 
               else 0 END             )  
   FROM RechnungGutschrift r  
   WHERE r.AuftragsID = a.AuftragsID  
) AS Betrag  
 
FROM Auftrag a  
WHERE a.AuftragsID = '123456'
Grüße
Biber
Bitte warten ..
Ähnliche Inhalte
Datenbanken
SQL LEFT JOIN in Spalten
gelöst Frage von StfnCstrDatenbanken5 Kommentare

Hallo, ich sehe mal wieder den Wald vor lauter Bäumen nicht. Ich habe 2 Tabellen Tabelle 1: PK, Vorname, ...

Datenbanken
SQL - JOIN zeigt mehrfaches an
Frage von MiStDatenbanken9 Kommentare

Guten Morgen, ich habe mich frisch mit dem Thema SQL "angefreundet". Jetzt habe ich aber irgendwie ein Problem. Und ...

Datenbanken
MS-SQL-Abfrage min max und zugehörige Werte aus JOIN
Frage von AximandDatenbanken3 Kommentare

Hallo, wenn ich in einem JOIN über 2 Tabellen durchführe und mir min/max-Wert eines Feldes anzeigen lasse. Wie bekomme ...

Datenbanken
SQL - Mehrere Tabellen über JOINS verketten
Frage von GwahlersDatenbanken1 Kommentar

Aktuell habe ich das Problem dass die Ausgabe von meinen Erwartungen abweicht JOINS und Tabellen im Anhang Folgende Abfrage ...

Neue Wissensbeiträge
Humor (lol)

"gimme gimme gimme": Automatischer Test stolpert über Easter Egg im man-Tool

Information von Penny.Cilin vor 1 StundeHumor (lol)2 Kommentare

Interessant, was man so alles als Easter Egg implementiert. Ist schon wieder Ostern? "gimme gimme gimme": Automatischer Test stolpert ...

MikroTik RouterOS

Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen

Anleitung von colinardo vor 16 StundenMikroTik RouterOS8 Kommentare

Einleitung Folgende Anleitung ist aus der Lage heraus entstanden das ein Kunde auf seinem Mikrotik sein Hotspot Captive Portal ...

Sicherheit

Sicherheitslücke in HP-Druckern - Firmware-Updates stehen bereit

Information von BassFishFox vor 17 StundenSicherheit1 Kommentar

Ein weiterer Grund, dass Drucker keinerlei Verbindung nach "auswaerts" haben sollen. Unter Verwendung spezieller Malware können Angreifer aus der ...

Administrator.de Feedback

Entwicklertagebuch: Die Startseite wurde überarbeitet

Information von admtech vor 19 StundenAdministrator.de Feedback10 Kommentare

Hallo Administrator User, mit dem Release 5.7 haben wir unsere Startseite überarbeitet und die Beiträge und Fragen voneinander getrennt. ...

Heiß diskutierte Inhalte
Windows Server
RDP macht Server schneller???
Frage von JaniDJWindows Server17 Kommentare

Hallo Community, wir betrieben seit geraumer Zeit diverse virtuelle Maschinen und Server mit Windows Server 2012. Leider haben wir ...

Windows Netzwerk
Netzwerk Neustrukturierung
Frage von IT-DreamerWindows Netzwerk16 Kommentare

Hallo verehrte Community und Admins, bei uns im Haus steht eine Neustrukturierung an. Dafür benötige ich von euch ein ...

Windows 10
Windows 10 dunkler Bildschirm nach Umfallen
Frage von AkcentWindows 1015 Kommentare

Hallo, habe hier einen Windows 10 Rechner der von einem User umgefallen wurde (Beine übers Knie, an den PC ...

Linux
OpenSource Groupware
Frage von FA-jkaLinux13 Kommentare

Hallo, ich suche eine Groupware als Alternative zum Exchange. Wesentliche Aufgaben sind die Handhabung von E-Mails (persönliche und gemeinsam ...