Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Szenarienvergleich mit einem Join. Elementliste darf nicht eingeschränkt werden.

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Ramki, 20 Juli 2016.

  1. Ramki

    Ramki Benutzer

    Hallo zusammen,

    ich komme bei einem Problem nicht weiter. Ich habe eine Liste von Ländern. Meine Abfrage soll
    die Umsätze nach Land für 2 verschiedene Szenarien abrufen (Budget, 2016, Monat 2 / Actual 2016
    Monat 2), nebeneinander stellen und auch gleich die Abweichung mitliefern.

    Mein Problem: So, wie ich die Abfrage aufgebaut habe, wird die Länderliste bereits auf das erste Szenario
    eingeschränkt. Somit ist die Länderliste nicht vollständig und Länder, die nur im zweiten Szenario Umsätze
    hätten, werden nicht angezeigt. Damit passt die Gesamtsumme des 2. Szenarios nicht.

    Dass sich meine Abfrage so verhält, ist für mich noch logisch nachvollziehbar. Allerdings fehlt mir die Idee,
    wie ich das umbauen kann, damit die Länderliste definitiv immer komplett ist und nicht eingeschränkt wird.

    Hier mal meine Abfrage, die ich zur besseren Lesbarkeit mal ein wenig auseinander gezogen habe.
    Wäre klasse, wenn ihr mir helfen könnt.

    Danke,
    Ramki

    Select s1.[Country],
    s1.x as Scenario1,
    s2.x as Secanrio2,
    (s2.x-s1.x) as diff

    from(

    select [Country], sum([Net Sales 3rd Party]) as x from [base_data$] where Scenario = ('Budget') and Year = ('2016') and Month IN ('2') group by [country])

    s1 left join (

    select [Country], sum([Net Sales 3rd Party]) as x from [base_data$] where Scenario = ('Actual') and Year = ('2016') and Month IN ('2')group by [Country])

    s2 on s1.[Country] = s2.[Country] order by (s1.x-s2.x) asc
     
  2. ukulele

    ukulele Datenbank-Guru

    Also mir fallen da erstmal zwei sinnvolle Wege mit Join ein. Entweder du holst erst nur eine Liste mit allen Ländern und joinst dann zwei mal per LEFT JOIN deine Summen dazu. Oder du nimmst einen FULL OUTER JOIN, zugegeben den nutze ich auch selten müsste aber gehen.

    Alternativ würde ich CASE nutzen, das ist meines erachtens am kürzesten:
    Code:
    SELECT   t.[Country],
         t.Scenario1,
         t.Scenario2,
         t.Scenario1 - t.Scenario2 AS diff
    FROM   (
    
    SELECT   [Country],
         sum( CASE WHEN Scenario = 'Budget' THEN [Net Sales 3rd Party] ELSE 0 END) AS Scenario1,
         sum( CASE WHEN Scenario = 'Actual' THEN [Net Sales 3rd Party] ELSE 0 END) AS Scenario2
    FROM   [base_data$]
    WHERE   [Year] = '2016'
    AND     [Month] IN ( '2' )
    GROUP BY [Country]
    
         ) t
    ORDER BY t.Scenario1 - t.Scenario2 ASC
    Ich habe jetzt noch mit einem Subselect gearbeitet, das macht das Rechnen mit Scenario1 und 2 leichter, man kann das aber auch direkt im ersten Select mit einer längeren Rechnung machen.
     
    Ramki gefällt das.
  3. Ramki

    Ramki Benutzer

    Hallo Ukulele,

    super, das funktioniert perfekt. Vielen Dank!
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden