none
SQL Query String Schleife für mehrere Monate RRS feed

  • 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.

    Dienstag, 9. Dezember 2014 06:20

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/Sargable

    Stell 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
    Dienstag, 9. Dezember 2014 07:30
  • 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
    Donnerstag, 26. März 2015 09:27

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/Sargable

    Stell 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
    Dienstag, 9. Dezember 2014 07:30
  • 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

    Donnerstag, 26. März 2015 09:08
  • 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:

      http://blogs.msdn.com/b/spike/archive/2008/07/22/the-simplification-of-join-simple-example-of-how-t-sql-join-work.aspx


    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


    Donnerstag, 26. März 2015 09:22
    Moderator
  • 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
    Donnerstag, 26. März 2015 09:27
  • Prima und Dankeschön !!!
    Donnerstag, 2. April 2015 03:35