Schichtumsätze über ein Jahr

Eine Kleinigkeit noch zur Nachtschicht: Die würde in dem Fall jetzt ja nur von 2 bis 5 Uhr morgens gehen oder? Sie müsste aber von 22 Uhr am Vortag bis 5 Uhr Morgens gehn. Sry falls ich da nur was falsch versteh.
In diesem Fall würden alle Umsatze deren Zeit bei Stunde eine 5 enthällt (also auch 05:59:59) mit gezählt. Erst wenn Stunde auf 6 springt würde sich die Schichtzuordnung ändern.

Schicht von 22 Uhr Abends bis 6 Uhr Morgens läßt sich auch lösen, du musst dann aber bedenken das das Datum in dieser Zeit wechselt. Du haßt 3 Möglichkeiten:
a) Umsätze Tag X 00.00 Uhr bis 05.59 Uhr und Tag X 22.00 Uhr bis 23.59 Uhr werden zu Umsätze Tag X Nachtschicht
b) Umsätze Tag X 00.00 Uhr bis 05.59 Uhr und Vortag 22.00 Uhr bis 23.59 Uhr werden zu Umsätze Tag X Nachtschicht
c) Umsätze Folgetag 00.00 Uhr bis 05.59 Uhr und Tag X 22.00 Uhr bis 23.59 Uhr werden zu Umsätze Tag X Nachtschicht
Das solltest du erst definieren.
 
Werbung:
Das sieht richtig gut aus!
DAnke für die Erklärung jetzt ergibt alles etwas mehr Sinn :D

Das Problem mit der Zeit würd ich für den Moment dann noch hinten anstellen. b) sieht aber nach der richtigen Möglichkeit aus.

Die Fehlermeldung ist jetzt:
Invalid Column name at "Salesbezeichnung",
hierfür verwendet die Firma natürlich einen anderen Begriff allerdings ohne sonderzeichen oder sonstige Auffälligkeiten. Auch der Datenbankname ist etwas kryptisch, ich habe mal versucht mich von der Bezeichnung her anzunähern falls da was im argen liegt.
Die Fehlermeldung ist jetzt:


Code:
SELECT   t.Datum,
            t.Schicht,
            sum(t.UmsatzSB1) AS UmsatzSB1

FROM    (

SELECT    left(StationName,charindex('K',StationName)-1) AS Standort,
        cast([Date] AS DATE) AS Datum,
        (    CASE
            WHEN    datepart(hh,[Date]) BETWEEN 2 AND 5     THEN    'Nacht'
            WHEN    datepart(hh,[Date]) BETWEEN 6 AND 13    THEN    'Früh'
            WHEN    datepart(hh,[Date]) BETWEEN 14 AND 22   THEN    'Spät'
            ELSE    'Fehler/Zeit'
            END ) AS Schicht,
        Salesbezeichnung AS UmsatzSB1
   
FROM    "Datenbankname"."dbo"."FirmaSales"
WHERE    datepart(year,[Date]) = 2015

            ) t
   
GROUP BY t.Datum,t.Schicht, Salesbezeichnung
 
Du versuchst nach Salesbezeichnung im äußeren Select zu gruppieren, da gibts die Spalte aber nicht die benennst du ja im inneren Select in UmsatzSB1 um. Abgesehen davon macht die im GROUP BY keinen Sinn weil sie ja durch sum() aggregiert und nicht gruppiert wird. Also einfach raus damit aus GROUP BY.
 
JUHU!!! es läuft!!

Rechnet zwar eine weile aber geht!
Jetzt also nur noch feintuning.

upload_2015-6-18_14-6-29.png

Ich war mal so frei und hab die Umsatzzahlen rausgestrichen ^^
In der letzten Zeile sieht mans knapp das ab und an der "Fehler/Zeit" aufploppt. ich vermute einfach mal immer dann wenn zwischen 22 und 2 Uhr Umsatz gemacht wurde.
Also auf zur Möglichkeit b), klappt es wenn ich hier einfach noch ein Zeile Einfüge und das Datum-1 nehme für den Vortag und das dann auch als "Nacht" deklariere oderm uss das in einer Zeile laufen?

ohhh und ein ORDER BY Date muss wohl auch sein

Wenns von der Chefin dafür Kekse gibt teil ich mit euch:D
 
Ungefähr so:
Code:
SELECT    t.Datum,
        t.Schicht,
        sum(t.UmsatzSB1) AS UmsatzSB1

FROM    (

SELECT    left(StationName,charindex('K',StationName)-1) AS Standort,
--        Umsätze nach ab 22.00 Uhr werden der Nachtschicht des nächsten Tages zugerechnet
        (    CASE
            WHEN    datepart(hh,[Date]) BETWEEN 22 AND 23
            THEN    cast([Date] AS DATE)+1
            ELSE    cast([Date] AS DATE)
            END ) AS Datum,
        (    CASE
            WHEN datepart(hh,[Date]) BETWEEN 22 AND 23
            OR datepart(hh,[Date]) BETWEEN 0 AND 5 THEN 'Nacht'
            WHEN datepart(hh,[Date]) BETWEEN 6 AND 13 THEN 'Früh'
            WHEN datepart(hh,[Date]) BETWEEN 14 AND 21 THEN 'Spät'
            ELSE 'Fehler/Zeit'
            END ) AS Schicht,
        Salesbezeichnung AS UmsatzSB1
  
FROM    "Datenbankname"."dbo"."FirmaSales"
WHERE    datepart(year,[Date]) = 2015

        ) t

GROUP BY t.Datum,t.Schicht
ORDER BY t.Datum,t.Schicht
 
Ungefähr so:
Code:
SELECT   t.Datum,
     t.Schicht,
     sum(t.UmsatzSB1) AS UmsatzSB1

FROM   (

SELECT   left(StationName,charindex('K',StationName)-1) AS Standort,
--     Umsätze nach ab 22.00 Uhr werden der Nachtschicht des nächsten Tages zugerechnet
     (   CASE
       WHEN   datepart(hh,[Date]) BETWEEN 22 AND 23
       THEN   dateadd(day,1,cast([Date] AS DATE))
       ELSE   cast([Date] AS DATE)
       END ) AS Datum,
     (   CASE
       WHEN datepart(hh,[Date]) BETWEEN 22 AND 23
       OR datepart(hh,[Date]) BETWEEN 0 AND 5 THEN 'Nacht'
       WHEN datepart(hh,[Date]) BETWEEN 6 AND 13 THEN 'Früh'
       WHEN datepart(hh,[Date]) BETWEEN 14 AND 21 THEN 'Spät'
  ELSE 'Fehler/Zeit'
  END ) AS Schicht,
     Salesbezeichnung AS UmsatzSB1
   
FROM   "Datenbankname"."dbo"."FirmaSales"
WHERE   datepart(year,[Date]) = 2015

     ) t

GROUP BY t.Datum,t.Schicht
ORDER BY t.Datum,t.Schicht
 
Perfekt, das läuft jetzt auch super!
Unglaublich wie schnell du das hingekriegt hast

sind aber die Umsätze für alle SB Märkte wenn ich das richtig seh.
Gibts eine möglichkeit automatisch die Märkte einzeln abzufragen, also in eienr Tabelle aber jeder SB Markt eine eigene Spalte?
Ansonsten copy+paste ich per Hand und füge jeweils noch eine WHERE klausel oder?
 
@akretschmer:
Ob Zeile oder Spalte soll wahrlich nicht das Problem sein, als da nehm ich gerne die einfachere Möglichkeit.
Aber wenn ich deine Vorschlag richtig interpretier fürcht ich gibt es ein Problem: Es werden nicht die SB Märkte an sich gespeichert sondern nur die Kassen und die Umsätze pro Kasse, ein SB MArkt kann also 2 oder 3 Kassen haben, dennoch soll das ERgebniss pro SB sein, also eine Summe von mehreren Kassen.

in den Daten sind einzelne Kassen als StationName bezeichnet und sind z.B. SB 1 K1 (also SB Markt 1 KAsse 1).

Ich probier deine Variante mal, aber wie gesagt fürchte ich er Gruppiert mir dabei nach Kassen.
Bisher hab ich einzelne Sb Märkte immer mit
WHERE StationName LIKE 'SB 1K%'
angesprochen.
 
@Distrilec , wie gesagt die Darstellung ist erstmal nebensächlich, das wird die Kollegin dann schon richtig formatieren. Ich werd ihr aber mal Pivot Tabellen ans Herz legen :)
 
in den Daten sind einzelne Kassen als StationName bezeichnet und sind z.B. SB 1 K1 (also SB Markt 1 KAsse 1).

Ich probier deine Variante mal, aber wie gesagt fürchte ich er Gruppiert mir dabei nach Kassen.

Dann mußt mit Stringfunktionen das auf den Markt reduzieren. Es wäre aber besser, du würdest dazu 2 Felder nehmen: Markt und Kasse. Normalisierung.
 
Beim THema Normalisierung geb ich dir absolut recht.
Wäre es auch denkbar das ganze über einen weiteren CASE zu realisieren? und falls ja wo müsste dieser im Code sein?
ich hab hier mal beispielhaft meine Idee eingefügt, allerdings wohl falsch den ermeckert das ganze sofort an (syntax error bei "(" )

Code:
SELECT   t.Datum,
     t.Schicht,
     sum(t.UmsatzSB1) AS UmsatzSB1,
     sum(t.UmsatzSB2) AS UmsatzSB2,
     sum(t.UmsatzSB3) AS UmsatzSB3

FROM   (

SELECT   left(StationName,charindex('K',StationName)-1) AS Standort,
--     Umsätze nach ab 22.00 Uhr werden der Nachtschicht des nächsten Tages zugerechnet
     (   CASE
       WHEN   datepart(hh,[Date]) BETWEEN 22 AND 23
       THEN   dateadd(day,1,cast([Date] AS DATE))
       ELSE   cast([Date] AS DATE)
       END ) AS Datum,
     (   CASE
       WHEN datepart(hh,[Date]) BETWEEN 22 AND 23
       OR datepart(hh,[Date]) BETWEEN 0 AND 5 THEN 'Nacht'
       WHEN datepart(hh,[Date]) BETWEEN 6 AND 13 THEN 'Früh'
       WHEN datepart(hh,[Date]) BETWEEN 14 AND 21 THEN 'Spät'
  ELSE 'Fehler/Zeit'
  END ) AS Schicht,
     Salesbezeichnune AS UmsatzSB1
    
     (    CASE
         WHEN StationName LIKE 'SB 2 K%' AS UmsatzSB2
         WHEN StationName LIKE 'SB 3 K%' AS UmsatzSB3
         END
         )
  
FROM   "DatenbankName"."dbo"."FirmaSalesProduct"
WHERE   datepart(year,[Date]) = 2015


     ) t

GROUP BY t.Datum,t.Schicht
ORDER BY t.Datum,t.Schicht
 
Wäre es auch denkbar das ganze über einen weiteren CASE zu realisieren? und falls ja wo müsste dieser im Code sein?

Wenn Du Zeilen zu Spalten machen willst und bei jeder Änderung (neue Kasse, neue Filiale) Dein Selekt neu zusammenfrickeln willst dann geht das auch mit CASE. Ich hab das schon mal als FAQ gezeigt, wie man Zeilen zu Spalten macht.
 
Werbung:
Also die Kassen der jeweiligen Märkte sollten ja durch
Code:
left(StationName,charindex('K',StationName)-1) AS Standort,
zu Standort zusammengefasst werden. Läuft das nicht richtig? - Prüf das bitte und erst dann machen wir den nächsten Schritt.

Mit diesen Daten kann man dann weiter arbeiten und da würde ich auch PIVOT empfehlen. Das nervige an PIVOT ist das es so starr ist. Du musst alle Märkte aufzählen, also alle Werte die bei Standort raus kommen können. Ich schreib das mal heut Mittag.
 
Zurück
Oben