Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL-Abfrage Plus- und Minus-aufteilen (https://www.delphipraxis.net/171440-sql-abfrage-plus-und-minus-aufteilen.html)

Captnemo 6. Nov 2012 21:01

Datenbank: MSSQL Express Edition • Version: 2005 • Zugriff über: ADO

SQL-Abfrage Plus- und Minus-aufteilen
 
Hi,

ich habe eine SQL-Tabelle:

Code:
Datum     | Betrag |
-----------+--------+
01.10.2012 |  10.00 |
02.10.2012 | -15.00 |
03.10.2012 |  -5.00 |
04.10.2012 |  20.00 |
05.10.2012 |  20.00 |
usw.

Auf die Tabelle möchte ich jetzt eine Abfrage machen, die mir die Spalte Betrag summiert, aber getrennt nach Minus- und Pluswerten.

Also zum Beispiel gruppiert nach Monat:

Code:
Monat |  Plus | Minus
------+-------+-------
10    | 50.00 | -20.00
Das ganze natürlich in einer Abfrage. Natürlich könnte ich 2 Abfragen machen, und die dann später in der Anwendung zusammensetzen. Aber ich denke das müßte doch auch in einer gehtn, oder?

Sir Rufo 6. Nov 2012 21:20

AW: SQL-Abfrage Plus- und Minus-aufteilen
 
Schau dir mal
Code:
IIF
oder
Code:
CASE
an, damit kannst du das lösen

sx2008 6. Nov 2012 21:31

AW: SQL-Abfrage Plus- und Minus-aufteilen
 
Du nimmst jeweils eine Abfrage für die positiven und die negativen Summen und führst sie mit einem FULL OUTER JOIN zusammen:
Code:
SELECT Monat, TabA.Summe AS Plus, TabB.Summe AS Minus FROM
(***1) TabA FULL OUTER JOIN (***2) TabB ON TabA.Monat = TabB.Monat
ORDER BY Monat
FULL OUTER JOIN deshalb, weil nicht gesagt ist, dass in jedem Monat sowohl positive als auch negative Summen auftreten.

Der Platzhalter (***1) steht für die positiven Summen:
Code:
SELECT Monat, SUM(Betrag) AS Summe FROM Tabelle
WHERE Betrag >= 0
GROUP BY Monat
Der Platzhalter (***2) steht für die negativen Summen:
Code:
SELECT Monat, SUM(Betrag) AS Summe FROM Tabelle
WHERE Betrag <= 0
GROUP BY Monat
Der Monat steht so zwar nicht direkt in deiner Tabelle, er lässt sich aber mit SQL berechnen.
(Ich würde ja Jahr/Monat verwenden)
Jetzt musst du nur noch die Teile zusammensetzen.

himitsu 6. Nov 2012 21:33

AW: SQL-Abfrage Plus- und Minus-aufteilen
 
Im Notfall könnte man bestimmt auch einen JOIN verwenden.
z.B. im SELECT alle + summieren und im JOIN alle -

Ansonsten meint Sir Rufo wohl sowas wie
Delphi-Quellcode:
SELECT SUM(IfThen(preis < 0, preis, 0)) AS negativ, SUM(IfThen(preis > 0, preis, 0)) AS positiv ...
, so in der Art.

Sir Rufo 6. Nov 2012 21:45

AW: SQL-Abfrage Plus- und Minus-aufteilen
 
Das ist schon mal die Basis:
Code:
SELECT
  Datum,
  IIF( Betrag > 0, Betrag, 0 ) AS Plus,
  IIF( Betrag < 0, Betrag, 0 ) AS Minus
FROM
  MyTable
und darauf kann man dann weiter aufbauen (GROUP)

DeddyH 6. Nov 2012 21:47

AW: SQL-Abfrage Plus- und Minus-aufteilen
 
Oder man nimmt den Käse (Case), das unterstützen AFAIK die meisten bekannten RDBMS.

Sir Rufo 6. Nov 2012 21:50

AW: SQL-Abfrage Plus- und Minus-aufteilen
 
Zitat:

Zitat von DeddyH (Beitrag 1190059)
Oder man nimmt den Käse (Case), das unterstützen AFAIK die meisten bekannten RDBMS.

Jo, aber es geht hier ja konkret um MSSQL ;)

Jumpy 6. Nov 2012 21:51

AW: SQL-Abfrage Plus- und Minus-aufteilen
 
Oder aber Subselects, wobei das sicher am unelegantesten ist:


Select Distinct Year(Datum) as Jahr, Month(Datum) as Monat,
(Select Sum(Betrag) From Tabelle Where Betrag>0 and Year(Datum)=Year(T.Datum) and Month(Datum)=Month(T.Datum)) as Plus,
(--analog--) as Minus
From Tabelle T

Die Funktionen Month() und Year() oder vergleichbar auf der DB vorausgesetzt und das Jahr mal mit berücksichtigt.

DeddyH 6. Nov 2012 21:57

AW: SQL-Abfrage Plus- und Minus-aufteilen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1190060)
Jo, aber es geht hier ja konkret um MSSQL ;)

Schon klar, aber wozu spezifische Optionen benutzen, wenn es auch allgemeiner geht?

Captnemo 7. Nov 2012 06:58

AW: SQL-Abfrage Plus- und Minus-aufteilen
 
Danke für alle Antworten.
Letztlich habe ich mich für Case entschieden, weil im Management Studio hat er bei allen IF-Statements immer nur rumgemeckert. Ich hab zwar überall nach dem richtigen Syntax gegoogelt, aber trotzdem hat ihn immer irgendwas gestört. Aber mit Case hat's dann auf Anhieb funktioniert.

Hier mein Statement:
Code:
SELECT

SUM(case when betrag>0 then betrag else 0 end) as Plus,
SUM(case when betrag<0 then betrag else 0 end) as Minus,
month(datum)

  FROM [VS2004].[dbo].[bank]
  where year(datum)=2012
  group by Month(datum)
Nochmals...danke :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:27 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz