Summierung basierend auf Zeit und Arbeitsbereich & Pivotisierung der Ergebnisse

OneHotEncoder

Neuer Benutzer
Beiträge
1
Hallo zusammen!

Ich habe den nachfolgenden Output (Bezeichnung raw_table), den ich aus verschiedenen Tabellen gejoined habe.
Zu sehe sind die verschiedenen Arbeitsstationen eines Unternehmens. Diese produzieren täglich (identische) Werkzeuge.
Die Daten sind als Ausschnitt zu verstehen, der Input reicht vom Jahr 2020 bis zum heutigen Datum.

Arbeitsstation (AS)Anzahl der produzierten WerkzeugeDatum
115001.01.2020
210001.01.2020
15001.02.2020
37015.01.2020
112008.02.2020

Mein Ziel ist es nun, die Anzahl der produzierten Produkte pro Arbeitsstation und pro Monat auszugeben.
Siehe nachfolgende Tabelle

Jahr&MonatAnzahl der Werkzeuge AS 1Anzahl der Werkzeuge AS 2Anzahl der Werkzeuge AS3Summe der produzierten Werkzeuge
2020/0120010070270
2020/021200080
2020/03
2020/041

Meine Idee hierzu wäre:
- die Anzahl der Tools per Arbeitsstation & Monat aufzusummieren
- Die Ergebnisse der Zeilen mit der Pivot-Funktion in Spalten umzuwandeln
(evtl. auch in umgekehrter Reihenfolge?!)

Vor allem zum ersten Schritt fehlen mir die richtigen Ansätze.
Mein Code bisher:

-- 1. Aufsummieren der produzierten Werkzeuge pro Monat pro Arbeitsstation

SELECT
Arbeitsstationen
, SUM(Anzahl der produzierten Werkzeuge )
, month(Datum)
from raw_table

->> Abfrage ist laut Oracle nicht möglich, außerdem würde ich das Ergebnis gerne in einer Zwischentabelle speichern

2. Umwandeln der Zeilen in Spalten

FROM
(SELECT
Anzahl der produzierten Werkzeuge
, Arbeitsstationen
, Datum
FROM
PIVOT
(Max(Anzahl der produzierten Werkzeuge)
FOR
Datum in ([Anzahl der produzierten Werkzeuge], [Arbeitsstationen], [Datum])
) as pivot_table



Ich freue mich sehr über jegliche Anregungen! Vielen Dank
 
Werbung:
Wie im Handbuch dokumentiert, gibt es keine Funktion month() in Oracle. Und der Monat ohne Jahr wäre ja sowieso wenig hilfreich

Du kannst z.B. to_char() verwenden:

Code:
select to_char(datum, 'yyyy-mm') as monat,
       arbeitsstation,
       sum(anzahl) as anzahl
from raw_table
group by to_char(datum, 'yyyy-mm'), arbeitsstation
order by 1, 2

Das kann man dann als Grundlage für ein PIVOT verwenden:

Code:
with grouped as (
  select to_char(datum, 'yyyy-mm') as monat,
         arbeitsstation,
         sum(anzahl) as anzahl
  from raw_table
  group by to_char(datum, 'yyyy-mm'), arbeitsstation
)
select *
from grouped
pivot (
  max(anzahl) as anzahl
  for arbeitsstation in (1, 2, 3, 4)
);

Alternativ kann man auch eine bedingte Aggregation mittels eine CASE Ausdrucks verwenden:

Code:
select to_char(datum, 'yyyy-mm') as monat,
       sum(case when arbeitsstation = 1 then anzahl end) as anzahl_as_1,
       sum(case when arbeitsstation = 2 then anzahl end) as anzahl_as_2,
       sum(case when arbeitsstation = 3 then anzahl end) as anzahl_as_3,
       sum(case when arbeitsstation = 4 then anzahl end) as anzahl_as_4
from raw_table
group by to_char(datum, 'yyyy-mm')
 
Zurück
Oben