2016-03-31 6 views
0

Wesentlichen, was mit Ich fange dann ist dies in TABLE_ASQL - wie Spalte mit einem durchschnittlichen Wert hinzufügen, gruppiert

France - 100 

France - 200 

France - 300 

Mexico - 50 

Mexico - 50 

Mexico - 56 

Poland - 100 

Poland - 150 

und was will ich am Ende haben, ist eine zusätzliche Spalte mit dem Wert Durchschnitt nach Land.

France - 100 - 200 

France - 200 - 200 

France - 300 - 200 

Mexico - 500 - 520 

Mexico - 500 - 520 

Mexico - 560 - 520 

Poland - 100 - 125 

Poland - 150 - 125 

Ich möchte dies tun, indem Sie TABLE_A aktualisieren/ändern und wenn möglich keine neue Tabelle erstellen. Ich arbeite in Oracle. Danke für irgendwelche Ideen!

+2

Ist der Plan, einen Auslöser zu haben, die die Mittelwerte immer Zeit aktualisiert eine Zeile eingefügt oder aktualisiert wird? Warum eine Spalte zur Tabelle hinzufügen, die das Ergebnis einer Aggregation ist? –

+0

Die Tabelle wird nicht aktualisiert - ich muss diese Spalte zur aktuellen Tabelle hinzufügen, damit sie beim Exportieren in ein anderes Programm angezeigt wird. – jdjohnson920

Antwort

2

Sie können avg() over() verwenden. Ich sehe keinen Grund, diese berechneten Spalten zu speichern. Sie müssten jedes Mal aktualisiert werden, wenn eine neue Zeile hinzugefügt wird oder wenn Zeilen in der Tabelle aktualisiert werden.

select t.*, avg(val) over(partition by country) average 
from yourtable t 

Um es als eine Spalte hinzuzufügen, gehen Sie:

alter yourtable add average number(10,2); 

commit; 

update yourtable t 
set t.average = (select avg(val) 
       from yourtable 
       where country = t.country) 
; 

commit; 
+0

Diese Tabelle wird nicht aktualisiert, das ist also kein Problem. Ich muss diese Tabelle in ein anderes Programm exportieren, daher muss die Spalte jetzt hinzugefügt werden, damit diese berechnete Spalte in dem anderen Programm verwendet werden kann. Gibt es eine Möglichkeit, diese Spalte zu TABLE_A hinzuzufügen, die Sie kennen? – jdjohnson920

+0

Ah, ok. Es ist also ein ganz anderes Problem als das, was ich dachte. Erneut, brechen Sie nicht die Normalisierung dafür, da dies Sie beißt, wenn Sie einen Tippfehler Monate später herausfinden und die Daten erneut exportieren müssen. – andrechalom

+2

@ jdjohnson920: Warum können Sie die Berechnung nicht einfach während des Exports hinzufügen, entweder direkt oder mit einer Ansicht? – dnoeth

1

Die kurze Antwort ist: nicht das tun. Sie brechen die Normalisierung der Datenbank, für etwas, das mit Funktionen getan werden kann. Wie Sie dies in Oracle tun, eine Funktion mit CACHE-Klausel schreiben kann, so etwas wie

FUNCTION average_by_country (country_id IN countries.id%TYPE) 
RETURN countries.whatever%TYPE 
RESULT_CACHE RELIES_ON (countries) 
IS 

etc etc, wird dies das Ergebnis für jedes Land zwischenzuspeichern, um die Funktion Auswertung sehr schnell zu machen.

Dann können Sie diese durchschnittliche wählen mit

SELECT country_id, country_name, country_data, average_by_country(country_id) 
FROM countries WHERE etc etc 
+0

Natürlich können Sie einfach eine "AVG (country_data)" mit "GROUP BY" in der Auswahl verwenden, aber ich nahm an, dass, wenn Sie nicht verwenden, es ist, weil Sie wirklich die zusätzliche Leistung benötigen. In jedem Fall sollten Sie die Leistung der Verwendung der Cache-Funktion mit den AVG- und GROUP BY-Abfragen in Ihren echten Daten vergleichen. – andrechalom

+0

Ich schätze die Stimmung, aber ich muss diese Spalte hinzufügen - diese Tabelle wird für den Einsatz an anderer Stelle exportiert, so dass es nicht mein Anruf ist. Ich muss nur die Spalte hinzufügen, ob es die Normalisierung bricht oder nicht. ---------------------- Wissen Sie, ob es möglich ist, diese Spalte zu TABLE_A hinzuzufügen? Ich weiß wie man AVG (variabel) gruppiert, aber ich muss nicht auswählen. Ich muss dies in TABLE_A schreiben. – jdjohnson920

+0

Ja, das ist möglich. Fügen Sie die Spalte mit einem "ALTER TABLE" -Befehl hinzu und aktualisieren Sie sie dann mit einer Unterabfrage, etwa "UPDATE countries SET new_column = (SELECT avg (bla bla))". Ich kann wirklich keinen vollständigen Arbeitscode bereitstellen, da Sie uns die Tabellenstruktur nicht zur Verfügung gestellt haben. – andrechalom