2017-08-07 3 views
0

Ich habe ein Szenario, in dem Aggregatwerte durch Werte angegeben werden müssen. Die möglichen Aggregationen Min, Max, Avg und ModusAggregationsberechnungen basierend auf bestimmten Spalten

Table 

ColumnA ColumnB 
    A  Min 
    A  Mode 
    A   Avg 

    B  Max 
    B  Avg 

    C  Mode 
    C  Min 

    D   Avg 

Table 2 

    ColumnC ColumnD ColumnE 

    Pr1  1.00  A 
    Pr2  2.00  A 
    Pr3  3.00  A 

    Pr1  4.00  B 
    Pr2  5.00  B 
    Pr4  1.00  B 

    Pr5  2.00  C 
    Pr6  6.00  C 

    Pr7  4.00  D 
    Pr8  5.00  D 

Need Aggregationen zu finden, wie in Tabelle 1 definiert und Werten in columnD in Tabelle 2 bereitgestellt Die Aggregationen werden von jeder Art von ColumnA gruppiert. Ich möchte einen Teil der gespeicherten Prozedur hinzufügen.

Output should be 

    ColumnF ColumnG ColumnH 
    A  Min  1.00 
    A  Mode  1.00 (if no mode exists take min value) 
    A   Avg  2.00 

    B  Max  5.00 
    B  Avg  3.34 

    C  Mode  2.00 
    C  Min  2.00 

    D   Avg  4.50 
+0

Und wie sind diese beiden Tabellen verwandt? Es gibt hier keinen eindeutigen Join Key ... und was nimmst du an? – scsimon

+0

Tabellen beziehen sich auf Spalte A und Spalte E – TechJump

Antwort

0

Hier ist eine Brute-Force-Lösung:

select t1.*, 
     (case when column_b = 'min' then min_d 
      when column_b = 'max' then max_d 
      when column_b = 'mode' then mode_d 
     end) as stat 
from t1 outer apply 
    (select min(d) as min_d, max(d) as max_d, avg(d) as avg_d, 
      (case when min(case when cnt = max_cnt then d end) = max(case when cnt = max_cnt then d end) 
        then max(case when cnt = max_cnt then d end) 
        else avg(d) 
       end) as mode_d 
     from (select t2.*, max(cnt) over() as max_cnt 
      from (select t2.*, count(*) over (partition by d) as cnt 
        from table2 t2 
       ) t2 
      ) t2 
    ) t2; 

Die mode Berechnung ein bisschen schwierig ist, aber ich denke, dass es das tut, was Sie wollen.

Verwandte Themen