Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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, 1913 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
gelöst SQL Multiple Join auf selbe ID (3)

Frage von Memo66 zum Thema Datenbanken ...

Datenbanken
SQL ORDER BY und Join mit 2 Tabellen (5)

Frage von Dipps zum Thema Datenbanken ...

Datenbanken
Mit sql eine Zeile einfügen, select und feste Werte (9)

Frage von helmuthelmut2000 zum Thema Datenbanken ...

Datenbanken
gelöst SQL . 2 Felder bzw. Werte vergleichen und Rückmeldung 0 oder 1 (2)

Frage von wawidl zum Thema Datenbanken ...

Neue Wissensbeiträge
Batch & Shell

Batch als Dienst bei Systemstart ohne Anmeldung ausführen

(4)

Tipp von tralveller zum Thema Batch & Shell ...

Sicherheits-Tools

Sicherheitstest von Passwörtern für ganze DB-Tabellen

(1)

Tipp von gdconsult zum Thema Sicherheits-Tools ...

Peripheriegeräte

Was beachten bei der Wahl einer USV Anlage im Serverschrank

(9)

Tipp von zetboxit zum Thema Peripheriegeräte ...

Heiß diskutierte Inhalte
Exchange Server
Exchange 2016 Standard Server 2012 R2 Hetzner Mail (41)

Frage von Datsspeed zum Thema Exchange Server ...

Windows 7
gelöst Lokales Adminprofil defekt (25)

Frage von Yannosch zum Thema Windows 7 ...

Off Topic
gelöst Fachzeitschriften als E-Book oder hardcoded? (11)

Frage von KowaKowalski zum Thema Off Topic ...

Windows 10
Windows Store Apps ohne Windows Store installieren (10)

Frage von keefien zum Thema Windows 10 ...