2016-04-29 8 views
3

Ich habe die folgende Abfrage:Berechnung Säule (Gewicht/max (Gewicht)

select ema.es_symbol as symbol, ema.score as score, ema.weight as weight, rsi.relative_strength_index as relative_strength_index 
from ema_score ema, relative_strength_index rsi inner join 
    (select rsi_symbol, max(rsi_date) as maxDate from relative_strength_index group by rsi_symbol) rsiDate 
    on rsi.rsi_symbol = rsiDate.rsi_symbol 
    and rsi.rsi_date = rsiDate.maxDate 
where ema.es_symbol = rsi.rsi_symbol 
and ema.score not in (0,1,10,11) 
and rsi.relative_strength_index not in (0,100); 

Ich versuche, eine berechnete Spalte wie die unten als die letzte Spalte hinzuzufügen:

ema.weight/max(ema.weight) 

Der Ergebnis Ich möchte jedes Symbolgewicht dividiert durch das maximale Gewicht in der Gewichtsspalte.Wenn ich es auf meine Art versuche, bekomme ich nur 1 Zeile Ergebnisse.Was genau mache ich hier falsch?

+0

Jede Aggregatfunktion, wie max(), ohne eine group by-Klausel, kollabiert das Resultset in einen einzelnen Datensatz. – Shadow

+0

Ich habe eine Gruppe versucht, aber meine berechnete Spalte erhält die gleiche Antwort für jede Zeile. – ULuFlanders

+0

@ULuFlanders, dass, weil Sie Unterabfrage als Divisor verwenden müssen, überprüfen Sie meine Antwort. –

Antwort

0

Sie müssen Unterabfrage mit verwenden MAX als Divisor, so etwas wie:

select ema.weight*1.0/(select max(weight) from #t ema2) 
from #t ema 
+1

Ich habe dies in die Abfrage angepasst und es funktioniert. Vielen Dank für Ihre Antwort. – ULuFlanders

0

beliebigen Aggregatfunktion, wie max(), ohne eine Gruppe von Klausel kollabiert das Resultset in einem einzigen Datensatz. Sie müssen den Maximalwert in einer Unterabfrage auswählen und ihn mit einem Kreuz-Join mit allen Datensätzen verknüpfen. Kombinieren Sie außerdem nicht implizite und explizite Joins, Sie können sehr unangenehme Überraschungen erleben, wenn Sie der Abfrage einen äußeren Join hinzufügen!

select ema.es_symbol as symbol, ema.score as score, ema.weight as weight, ema.weight/maxweight as percentage, rsi.relative_strength_index as relative_strength_index 
from ema_score ema 
    join (select max(weight) as maxweight from ema_score) t 
    inner join relative_strength_index rsi on ema.es_symbol = rsi.rsi_symbol 
    inner join 
    (select rsi_symbol, max(rsi_date) as maxDate from relative_strength_index group by rsi_symbol) rsiDate 
    on rsi.rsi_symbol = rsiDate.rsi_symbol 
    and rsi.rsi_date = rsiDate.maxDate 
where ema.score not in (0,1,10,11) 
and rsi.relative_strength_index not in (0,100); 
+0

Ich mag diese Lösung besser, aber es filtert keine Gewichte aus, die durch die unten stehende Where- und And-Klausel herausgefiltert werden. Entschuldigung, wenn meine Frage nicht so klar ist. – ULuFlanders

+0

Dann in der Unterabfrage müssen Sie die gleichen, wo Kriterien, einschließlich Joins leider hinzufügen. – Shadow