2017-07-24 4 views
1

Ich versuche derzeit, Aufträge in jedem Vorort zu zählen, die später als für einen Monat angefordert geliefert wurden, und die durchschnittliche Zeit, zu der sie verspätet waren.ORA-00904: "TOTAL_ORDERS": Ungültige Kennung

Ich habe dies bisher ohne die Parameterabfrage getan, damit der Benutzer den Monat eingibt, den sie sehen möchten.

SELECT s.suburbname, 
     Count(*) AS total_orders , 
     ("ORDER".ACTUALTIMEDELIVERED - "ORDER".CUSTREQTIME)/total_orders AS latetime 
FROM "ORDER" 
left join restaurant r 
     ON "ORDER".restaurantid = r.restaurantid 
left join suburb s 
     ON r.suburbid = s.suburbid 
     WHERE "ORDER".deliveredflag = 'X' 
     AND "ORDER".ACTUALTIMEDELIVERED > "ORDER".CUSTREQTIME 
GROUP BY s.suburbname 
ORDER BY total_orders, latetime; 

Allerdings ist es mir ein ORA-00904 werfen: "TOTAL_ORDERS": ungültige Kennung.

Ist es meine Gruppenklausel?

Update 1 Ich habe es geschafft zu lösen, danke euch allen! Aber jetzt habe ich ein anderes Problem. Ich kann nicht scheinen, INTERVALL-TAG ZU ZWEITEN Datentypen zu addieren, da es mich den Fehler wirft: ORA-00932: inkonsistente Datentypen: erwartete NUMMER erhielt INTERVALL-TAG ZU ZWEITEN.

Gibt es weg um den Unterschied in der Zeit zu summieren und zu mitteln?

Update 2

Ich habe es geschafft, alle mithilfe der Funktion EXTRACT meine Probleme zu lösen, die Stunden und Minuten extrahieren und sie alle zusammen gegen die Zählung summiert werden.

SELECT 

s.suburbname, 
     Count(*) AS total_orders, 

SUM(60*(Extract(hour from "ORDER".ACTUALTIMEDELIVERED) - Extract(hour from "ORDER".Custreqtime)) + Extract(minute from "ORDER".ACTUALTIMEDELIVERED) - Extract(minute from "ORDER".Custreqtime))as amt 


FROM "ORDER" 
     left join restaurant r 
       ON "ORDER".restaurantid = r.restaurantid 
     left join suburb s 
       ON r.suburbid = s.suburbid 
WHERE 
"ORDER".deliveredflag = 'X' 
AND 
"ORDER".ACTUALTIMEDELIVERED > "ORDER".CUSTREQTIME 
GROUP BY s.suburbname 
ORDER BY s.suburbname desc; 
+0

Wenn Sie eine neue Frage haben, sollten Sie ein wenig arbeiten, um die Antwort selbst zu finden, dann fragen Sie eine neue Frage. So funktioniert es nicht. Sie haben keinen eigenen Post, um Unterstützung für Oracle-Syntax zu erhalten! Du gehst ein Buch und lernst zuerst. –

+0

Entschuldigung. Ich habe es geschafft, mein im Update hervorgehobenes Problem zu lösen. Wird die Lösung für andere veröffentlichen. Es kann ihnen helfen – ABB25

Antwort

2

Sie können nicht wiederverwenden total_orders bei der Berechnung Sie tun entweder:

SELECT s.suburbname, Count(*) total_orders , 
("ORDER".ACTUALTIMEDELIVERED - "ORDER".CUSTREQTIME)/count(*) latetime  
FROM "ORDER" 
left join restaurant r 
... 

Hoffe, es hilft

+0

'AS' ist legale Syntax für Spaltenaliase (aber nicht für Tabellenaliase). – APC

+0

@APC, danke, mein schlechtes wieder. Aber kann 'total_orders' in der Syntax der Berechnung in der Auswahl verwendet werden? –

2

Probleme in dieser Linie sind ("ORDER".ACTUALTIMEDELIVERED - "ORDER".CUSTREQTIME)/total_orders AS latetime.

Total_order ist nur Spaltenalias in der Zeile zuvor definiert. Und die zweite versteckte Ausnahme ist ORA-00979: not a GROUP BY expression.

Wahrscheinlich sollten Sie die analytische Funktion in dieser Abfrage verwenden. Aber ich kenne Geschäftsanforderung nicht.

+0

Danke für Ihre Antwort! Ich habe das Problem gelöst, habe jetzt aber Schwierigkeiten, Intervall-Datentypwerte hinzuzufügen, die in meiner Frage hinzugefügt wurden – ABB25

Verwandte Themen