2017-12-26 16 views
0

Ich arbeite mit der folgenden Abfrage:Aggregieren Timestamp

SELECT contract, 
    source_ref1 AS "ORDER_NO", 
    part_no, 
    ifsapp.inventory_part_api.Get_description(contract, part_no) as "DESCRIPTION", 
    ifsapp.inventory_part_api.Get_unit_meas(contract, part_no) as "UNIT_MEAS", 
    date_applied, 
    (SELECT work_center_no FROM shop_order_operation where inventory_transaction_hist2.source_ref1 = shop_order_operation.order_no) AS "WORK_CENTER", 
    direction, 
     SUM(quantity) AS "QUANTITY", 
     (CASE 
      WHEN ((To_char(date_time_created, 'HH24:MI ') BETWEEN '05:45 ' AND '17:44') AND 
        date_applied = date_created) THEN 'SHIFT1' 
      WHEN (((To_char(date_time_created, 'HH24:MI') BETWEEN '17:45' AND '24:00') OR 
        (To_char(date_time_created, 'HH24:MI') BETWEEN '00:00' AND '05:44') AND 
        date_applied = date_created)) THEN 'SHIFT2' 
      ELSE 'MANUAL_ADJUST' 
     END) AS "SHIFT" 
FROM ifsapp.INVENTORY_TRANSACTION_HIST2 
WHERE part_no IN (select pc.part_no from ifsapp.HH_INV_PART_CHARS pc where pc.accounting_group = '400') AND 
     contract IN ('DE1', 'DE2') AND 
     transaction_code LIKE '%REC%' AND 
     direction IN ('+', '-') AND 
     source_ref_type = 'Shop Order' AND 
     To_char(date_applied, 'YYYY-MM-DD') BETWEEN '2017-01-01' AND '2017-12-26' 
GROUP BY contract,source_ref1, part_no, ifsapp.inventory_part_api.Get_description(contract, part_no), 
ifsapp.inventory_part_api.Get_unit_meas(contract, part_no), location_no, date_applied, direction, 
date_time_created, date_created 
ORDER BY date_applied 

Diese Abfrage liefert 18.292 Treffer.

Wenn ich die CASE-Anweisung entfernen und DATE_TIME_CREATED und DATE_CREATED im Abschnitt GROUP BY entfernen, gibt die Abfrage 1356 Treffer zurück.

Wir verwenden die CASE-Anweisung, um festzustellen, welche Verschiebung unser Produkt erzeugt hat. Das Feld date_time_created ist grundsätzlich ein Zeitstempel. Es ist das einzige Feld auf dieser Tabelle, mit dem wir feststellen können, welche Verschiebung das Produkt erzeugt hat.

Aber es führt auch dazu, dass wir 10x so viele Treffer bekommen, wie wir ohne es würden.

Nehmen Sie ORDER_NO 349321 als Beispiel. Wenn ich die Abfrage wie gezeigt abspiele, erhalte ich 61 Treffer. Wenn Sie die CASE-Anweisung entfernen und DATE_TIME_CREATED und DATE_CREATED aus dem GROUP BY-Abschnitt entfernen, erhalte ich zwei Treffer.

Wir haben keine Aufträge über zwei Schichten abgeschlossen. Also muss ich den Zeitstempel für jede Transaktion für ORDER_NO 349321 nicht kennen, und ich muss nicht wissen, ob jeder Zeitstempel in Shift 1 oder Shift 2 ist. Ich muss nur wissen, ob Transaktionen für diesen Auftrag waren in Shift 1 oder Shift 2 abgeschlossen.

Gibt es eine Möglichkeit, die Informationen, die ich von dieser Fallanweisung bekomme, zu aggregieren, um dies auszuarbeiten? Ich habe versucht, MAX und AVG in meiner Case-Anweisung zu verwenden, aber es gibt die gleiche Anzahl an Ergebnissen zurück.

+0

Geben Sie repräsentative Daten und das gewünschte Ergebnis an. –

+1

Wenn Sie es nicht absichtlich gemacht haben, sieht es so aus, als würden Sie in der "SHIFT 2" -Berechnung einen Satz Klammern um die OR-Bedingung verfehlen. Wie es jetzt ist, werden die "UND" -Bedingungen nicht als "ANDs" behandelt, da das OR nicht mit einer anderen Bedingung verknüpft ist. '( \t ( \t \t (TO_CHAR (date_time_created 'HH24: MI') zwischen '17: 45' und '24: 00') oder \t \t (TO_CHAR (date_time_created 'HH24: MI') zwischen '00: 00' AND '05: 44') und \t date_applied = date_created \t) ) ' Dies gilt nicht Ihr ursprüngliches Problem beheben, aber jetzt zu etwas zu beachten. – ravioli

Antwort

1

Wenn Sie die Spalten DATE_TIME_CREATED und DATE_CREATED nicht projizieren müssen, versuchen Sie die "SHIFT" -Berechnung in einer Unterabfrage durchzuführen, bevor Sie Ihre Aggregatverarbeitung durchführen. Etwas wie folgt aus:

SELECT 
    contract, 
    source_ref1 AS "ORDER_NO", 
    part_no, 
    ifsapp.inventory_part_api.Get_description(contract, part_no) AS "DESCRIPTION", 
    ifsapp.inventory_part_api.Get_unit_meas(contract, part_no) AS "UNIT_MEAS", 
    date_applied, 
    (SELECT work_center_no FROM shop_order_operation WHERE inventory_transaction_hist2.source_ref1 = shop_order_operation.order_no) AS "WORK_CENTER", 
    direction, 
    SUM(quantity) AS "QUANTITY", 
    "SHIFT" 
FROM 
(
    SELECT contract, source_ref1, part_no, date_applied, direction, quantity, 
    (CASE 
     WHEN ((TO_CHAR(date_time_created, 'HH24:MI ') BETWEEN '05:45 ' AND '17:44') AND 
       date_applied = date_created) THEN 'SHIFT1' 
     WHEN (((TO_CHAR(date_time_created, 'HH24:MI') BETWEEN '17:45' AND '24:00') OR 
       (TO_CHAR(date_time_created, 'HH24:MI') BETWEEN '00:00' AND '05:44') AND 
       date_applied = date_created)) THEN 'SHIFT2' 
     ELSE 'MANUAL_ADJUST' 
    END) AS "SHIFT" 
    FROM ifsapp.INVENTORY_TRANSACTION_HIST2 
    WHERE part_no IN (SELECT pc.part_no FROM ifsapp.HH_INV_PART_CHARS pc WHERE pc.accounting_group = '400') 
    AND contract IN ('DE1', 'DE2') 
    AND transaction_code LIKE '%REC%' 
    AND direction IN ('+', '-') 
    AND source_ref_type = 'Shop Order' 
    AND TO_CHAR(date_applied, 'YYYY-MM-DD') BETWEEN '2017-01-01' AND '2017-12-26' 
) src 
GROUP BY 
    contract, 
    source_ref1, 
    part_no, 
    ifsapp.inventory_part_api.Get_description(contract, part_no), 
    ifsapp.inventory_part_api.Get_unit_meas(contract, part_no), 
    location_no, 
    date_applied, 
    direction 
-- ,date_time_created, 
-- date_created 
ORDER BY date_applied 

Ich habe keine DDL/Daten, die Abfrage zu testen, so dass Sie auf jeden Fall einige Syntaxfehler erhalten. Aber versuchen Sie es und lassen Sie mich wissen, wie es geht.

Überprüfen Sie auch Ihre "SHIFT" Berechnung, es sieht aus wie Sie ein floating "ODER" drin ohne Klammern haben.

+0

Du hast es mein Freund :) – ravioli