Summe einer TeilAbfrage

Aber ist nicht gerade dafür das UNION gut?
Sodas er mir nicht die schnittmenge, sondern von allem allem gibt und zwangsweise den rest dann mit nullen aufüllt?

Aber danke ukulele, ich verusch mal mein Glück (ohne viel Hoffnung :( )
 
Werbung:
Ich versuche mal ein Beispiel zu geben:
Es gibt 7 Hersteller. Leute buchen jeden Monat Stunden auf den Hersteller. (Somit ist jeder Monat vorhaden.

Es kann es aber sein das im Juli, niemand was auf einen Hersteller bucht. (dieser Hersteller ist aber in jenem Fall in einem anderen monat zu finden)

Da anstatt der Hersteller jetzt nicht unter Juli auftaucht, möchte ich das er auftaucht mit 0 Stunden.

Aber wenn es nicht mit Union geht, glaub ich dir das :P (wie gesagt, ich bin da reingeworfen wurden, ich und google versuchen jetzt den anforderungen gerecht zu werden)
 
Das geht tendenziell auch mit UNION, aber wenn du nicht grade alle fehlenden Datensätze per Hand in das Query schreiben willst, musst du auch hier einen SELECT bauen der die fehlenden Datensätze nachliefert. Ungefähr so:

Code:
...
UNION ALL
SELECT    t1.Jahr,
        t1.Monat,
        t2.Hersteller,
        NULL AS Wert
FROM    (    SELECT    DISTINCT
                    datepart(yyyy,Datum) AS Jahr,
                    datepart(mm,Datum) AS Monat
            FROM    tabelle ) t1,
        (    SELECT    DISTINCT
                    Hersteller
            FROM    tabelle ) t2
WHERE    NOT EXISTS (    SELECT    1
                        FROM    tabelle
                        WHERE    datepart(yyyy,Datum) = t1.Jahr
                        AND        datepart(mm,Datum) = t1.Monat
                        AND        Hersteller = t2.Hersteller )

PS: Ich musste den andern Code übrigens grade korrigieren.

PPS: Geht nicht mehr, also hier:
Code:
SELECT    t1.Jahr,
        t1.Monat,
        t2.Hersteller,
        t3.Wert
FROM    (    SELECT    DISTINCT
                    datepart(yyyy,Datum) AS Jahr,
                    datepart(mm,Datum) AS Monat
            FROM    tabelle ) t1,
        (    SELECT    DISTINCT
                    Hersteller
            FROM    tabelle ) t2
LEFT JOIN (    SELECT    Hersteller,
                    datepart(yyyy,Datum) AS Jahr,
                    datepart(mm,Datum) AS Monat,
                    sum(Wert) AS Wert
            FROM    tabelle
            GROUP BY Hersteller,
                    datepart(yyyy,Datum),
                    datepart(mm,Datum) ) t3
ON        t1.Jahr = t3.Jahr
AND        t1.Monat = t3.Monat
AND        t1.Hersteller = t3.Hersteller
 
Ich versuche mal ein Beispiel zu geben:
Es gibt 7 Hersteller. Leute buchen jeden Monat Stunden auf den Hersteller. (Somit ist jeder Monat vorhaden.

Es kann es aber sein das im Juli, niemand was auf einen Hersteller bucht. (dieser Hersteller ist aber in jenem Fall in einem anderen monat zu finden)

Da anstatt der Hersteller jetzt nicht unter Juli auftaucht, möchte ich das er auftaucht mit 0 Stunden.

Aber wenn es nicht mit Union geht, glaub ich dir das :p (wie gesagt, ich bin da reingeworfen wurden, ich und google versuchen jetzt den anforderungen gerecht zu werden)

Du suchst eine Kombination aller Hersteller mit allen Monaten. Das ist ein Cross-Join. select distinct hersteller ... cross join select distinct [alle Monate]
 
Du suchst eine Kombination aller Hersteller mit allen Monaten. Das ist ein Cross-Join. select distinct hersteller ... cross join select distinct [alle Monate]


Den nimmst dann und Joinst weiter. Um es mal zu zeigen:

Code:
test=*# select * from hazel ;
 kunde | monat | umsatz
-------+-------+--------
  1 |  1 |  10
  1 |  3 |  20
  2 |  1 |  11
  2 |  2 |  22
  2 |  3 |  33
  3 |  2 |  1
  3 |  3 |  2
(7 rows)

test=*# select x.kunde, x.monat, sum(umsatz) from (select bar.kunde, foo.monat from (select distinct kunde from hazel) bar cross join (select distinct monat from hazel) as foo) x left join hazel on ((x.kunde,x.monat)=(hazel.kunde,hazel.monat)) group by x.kunde, x.monat;
 kunde | monat | sum
-------+-------+-----
  1 |  1 |  10
  1 |  2 |
  1 |  3 |  20
  2 |  1 |  11
  2 |  2 |  22
  2 |  3 |  33
  3 |  1 |
  3 |  2 |  1
  3 |  3 |  2
(9 rows)
 
Werbung:
Hi,

danke für die Hilfe, ich werde mir das genauer angucken.

Ich hab da noch was :/
Warscheinlich einfacher und algemeingültiger.

Und zwar brauch ich nur Daten des letzten Jahres, das Problem ist das nur abgeschlossene Monate mit einbezogen werden sollen.

Das heißt am 07.02 brauch ich die Daten von Januar 13 bis Januar 14.

und am 24.04 die Daten von März 13 bis März14.

Folgenden String habe ich mir gebastelt:


WHERE ServiceTickets.Response_SLA_Stopped_Date >= DateAdd(mm, 1, DateAdd(mm, 0, DateAdd(yy, DateDiff(yy, 0, '2013'), 0))) AND ServiceTickets.Response_SLA_Stopped_Date <= DateAdd(mm, 1, DateAdd(yy, DateDiff(yy, 0, '2013') + 1, -1))



aber irgendwie zeigt er mir trotzdem den Februar an?



EDIT: Vergisst es, hab den Fehler schon selber gefunden, das komtm vom hin und her kopieren.
so ist es richtig:

ServiceTickets.Resolution_SLA_Stopped_Date > DateAdd(m, DateDiff(m, 0, GetDate()) - 12, 0) AND ServiceTickets.Resolution_SLA_Stopped_Date < DateAdd(m, -1,
DateAdd(mm, DateDiff(m, 0, GetDate()) + 1, 0)))


Danke und Gruß
 
Zuletzt bearbeitet:
Zurück
Oben