2016-04-14 10 views
0

Ich habe zwei Tabellen, table_a und table_b wie unten.Summenwerte einer Zeile, nachdem ein Varchar einen numerischen Wert erhalten hat

Tabelle table_a:

a_id |columna |varchar1|varchar2|varchar3 
---------------------------------- 
| 1 | a  | Medium | High | n/a 
| 2 | b  | Low | n/a | n/a 
| 3 | c  | Medium | Low | High 

In table_a jeder varchar Wert einen numerischen Wert gegeben: Hoch als 1, Medium als 2 und Low als 3.

Tabelle table_b :

b_id |columna_fk|average 
-------------------------- 
| 1 | a  | 
| 1 | b  | 
| 3 | c  | 

Wie erhalten Sie Durchschnittswerte (Ignorieren von N/A) der Zeilen- und Aktualisierungsdurchschnittsspalte in table_b?

Zum Beispiel siehe Tabelle unten:

b_id |columna_fk|average 
-------------------------- 
| 1 | a  | 1.5 
| 1 | b  | 3 
| 3 | c  | 2 

Antwort

0

Danke für deine Antwort, ich einige Änderungen vorgenommen und es ist für mich zu arbeiten. unten ist meine Änderung.

update b 
set average = 
(case when 
((case varchar1 when 'High' then 1 when 'Medium' then 2 when 'Low' then 3 else 0 end) + 
(case varchar2 when 'High' then 1 when 'Medium' then 2 when 'Low' then 3 else 0 end) + 
(case varchar3 when 'High' then 1 when 'Medium' then 2 when 'Low' then 3 else 0 end)) <> 0 
then 
((case varchar1 when 'High' then 1 when 'Medium' then 2 when 'Low' then 3 else 0 end) + 
(case varchar2 when 'High' then 1 when 'Medium' then 2 when 'Low' then 3 else 0 end) + 
(case varchar3 when 'High' then 1 when 'Medium' then 2 when 'Low' then 3 else 0 end)) 
/
((case varchar1 when 'n/a' then 0 else 1 end) + 
(case varchar2 when 'n/a' then 0 else 1 end) + 
(case varchar3 when 'n/a' then 0 else 1 end)) 
else null end) 
from a where a.columna = b.columna_fk; 
1

Eine Methode ist, Brute-Force:

update b 
    set average = ((case varchar1 when 'High' then 1 when 'Medium' then 2 when 'Low' then 3 end) + 
        (case varchar2 when 'High' then 1 when 'Medium' then 2 when 'Low' then 3 end) + 
        (case varchar3 when 'High' then 1 when 'Medium' then 2 when 'Low' then 3 end) 
       )/
        nullif((case varchar1 when 'n/a' then 0 else 1 end) + 
         (case varchar2 when 'n/a' then 0 else 1 end) + 
         (case varchar3 when 'n/a' then 0 else 1 end) 
         ) 
    from a 
    where a.columna = b.columna_fk; 
+0

Hallo @Gordon, Vielen Dank für Ihre Antwort, aber ich bin einen Syntaxfehler am Ende der letzten Klammer „)“ – Taz

+0

@Taz bekommen. . . Ich sehe kein offensichtliches Problem mit den Klammern. –