Benutzer mit den meisten Antworten
SQL Query String Schleife für mehrere Monate

Frage
-
Hallo zusammen,
ich habe folgenden Query gebastelt
select SUM(a.DocTotal - a.VatSum) from ORDR a where Year(a.DocDate) = '2014' and Month(a.DocDate) = '11' and a.CANCELED = 'N'
Damit ermittele ich die Gesamtsumme der Verkaufsaufträge für November 2014. Als Ergebnis bekomme ich eine Zahl. Ich würde jetzt gerne 12 Zahlen haben. Januar bis Dezember 2014. Also eine Monatsliste. Das ist mir aber leider zu hoch. Kann mir dabei bitte jemand helfen ?
Gruss aus Shanghai.
Antworten
-
Hallo nach Shanghai!
select SUM(a.DocTotal - a.VatSum) , Month(a.DocDate) as Monat from ORDR a where Year(a.DocDate) = '2014' and a.CANCELED = 'N' Group by Month(a.DocDate);
Die Gruppierung kannst du auch wahlweise auf Jahr + Monat ausweiten und die Where-Bedingung entsprechend kürzen.
Year(a.DocDate) ist übrigens non-sargeable.
http://en.wikipedia.org/wiki/SargableStell das am besten in Abhängigkeit vom Datentyp um auf z. B.
where a.DocDate between '20140101' and '20141231'
Dann kann auch ein Index über DocDate verwendet werden.
Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu- Als Antwort markiert Shanghai-ToBo Dienstag, 9. Dezember 2014 08:42
-
So sollte es gehen:
With Result1 as ( select SUM(a.DocTotal - a.VatSum) as SalesTotal , Month(a.DocDate) as Monat from ORDR a where Year(a.DocDate) = '2014' and a.CANCELED = 'N' Group by Month(a.DocDate) ), Result2 as ( select SUM(a.DocTotal - a.VatSum) as PROTotal , Month(a.DocDate) as Monat from OQUT a where Year(a.DocDate) = '2014' and a.CANCELED = 'N' and a.Series = '156' Group by Month(a.DocDate) ) Select a.SalesTotal, b.PROTotal, a.SalesTotal - b.PROTotal as TradingTotal, a.Monat as Months from Result1 a inner Join Result2 b on a.Monat = b.Monat Order by a.Monat;
Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu- Als Antwort markiert Shanghai-ToBo Donnerstag, 2. April 2015 03:35
Alle Antworten
-
Hallo nach Shanghai!
select SUM(a.DocTotal - a.VatSum) , Month(a.DocDate) as Monat from ORDR a where Year(a.DocDate) = '2014' and a.CANCELED = 'N' Group by Month(a.DocDate);
Die Gruppierung kannst du auch wahlweise auf Jahr + Monat ausweiten und die Where-Bedingung entsprechend kürzen.
Year(a.DocDate) ist übrigens non-sargeable.
http://en.wikipedia.org/wiki/SargableStell das am besten in Abhängigkeit vom Datentyp um auf z. B.
where a.DocDate between '20140101' and '20141231'
Dann kann auch ein Index über DocDate verwendet werden.
Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu- Als Antwort markiert Shanghai-ToBo Dienstag, 9. Dezember 2014 08:42
-
Ich muss leider diese alte Frage noch mal aufnehmen.
Nun habe ich zwei Strings die ich gerne zusammenfügen würde.
1.
select SUM(a.DocTotal - a.VatSum) as SalesTotal , Month(a.DocDate) as Monat from ORDR a where Year(a.DocDate) = '2014' and a.CANCELED = 'N' Group by Month(a.DocDate) Order by Monat
2.
select SUM(a.DocTotal - a.VatSum) as PROTotal , Month(a.DocDate) as Monat from OQUT a where Year(a.DocDate) = '2014' and a.CANCELED = 'N' and a.Series = '156' Group by Month(a.DocDate) Order by Monat
Also beides fast die gleichen Abfragen, nur aus verschiednenen Tabellen. Jetzt würde ich gern daraus eine machen und noch eine Spalte haben, wo das Ergebnis (TradingTotal) = SalesTotal aus 1 minus PROTotal aus 2 ist.
SalesTotal | PROTotal | TradingTotal | Months
-
Hi,
die beiden Resultsets miteinander verbinden kannst Du bspw. über UNION. Also bspw. so:
SELECT ... AS Spalte1, ... AS Spalte2 FROM <Tabelle1> UNION ALL SELECT ... AS Spalte1, ... AS Spalte2 FROM <Tabelle2>
Wenn Du die Werte aus Abfrage1 und Abfrage2 miteinander verbinden willst, so dass die Werte aus Abfrage2 als zusätzliche Spalten im Resultset auftauschen, geht das per JOIN.
WITH Query1 AS ( select SUM(a.DocTotal - a.VatSum) as SalesTotal , Month(a.DocDate) as Monat from ORDR a where Year(a.DocDate) = '2014' and a.CANCELED = 'N' Group by Month(a.DocDate) Order by Monat ), Query2 AS ( select SUM(a.DocTotal - a.VatSum) as PROTotal , Month(a.DocDate) as Monat from OQUT a where Year(a.DocDate) = '2014' and a.CANCELED = 'N' and a.Series = '156' Group by Month(a.DocDate) Order by Monat ) SELECT q1.SalesTotal, q2.PROTotal, ( q1.SalesTotal - q2.PROTotal ) AS TradingTotal, q1.Monat FROM Query1 q1 INNER JOIN Query2 q2 ON q1.Monat = q2.Monat
INNER JOIN zeigt in dem Fall nur die Werte an, für die es in beiden Abfragen einen Monat gibt. Weitere JOIN Arten findest Du hier:
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Donnerstag, 26. März 2015 09:27
-
So sollte es gehen:
With Result1 as ( select SUM(a.DocTotal - a.VatSum) as SalesTotal , Month(a.DocDate) as Monat from ORDR a where Year(a.DocDate) = '2014' and a.CANCELED = 'N' Group by Month(a.DocDate) ), Result2 as ( select SUM(a.DocTotal - a.VatSum) as PROTotal , Month(a.DocDate) as Monat from OQUT a where Year(a.DocDate) = '2014' and a.CANCELED = 'N' and a.Series = '156' Group by Month(a.DocDate) ) Select a.SalesTotal, b.PROTotal, a.SalesTotal - b.PROTotal as TradingTotal, a.Monat as Months from Result1 a inner Join Result2 b on a.Monat = b.Monat Order by a.Monat;
Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu- Als Antwort markiert Shanghai-ToBo Donnerstag, 2. April 2015 03:35