2017-10-12 3 views
1

Ich habe eine Tabelle calcuSQL-Spalte Berechnung mininimum Wert

id date  name  s1  s2  s3  s4  min_value 
1 10/10/2017 dicky 7  4  8  9  [4] 
2 10/10/2017 acton 12  15  17  19  [15] 
3 10/10/2017 adney 28  13  19  14  [13] 
------------------------------------------------------------------ 
when total by date  47  32  44  42 

Hier als Mindestspaltenwert s2 [32] genannt, deshalb s2 Wert = min_value Spalte.

check sqlfiddle here

Jetzt gibt es kein Problem. Wenn jedoch eines der Felder innerhalb des Werts s1, s2, s3, s4 gleich [see below example] mit einem beliebigen Feld ist, verdoppelt sich das Feld min_value und alle Spalten werden verdoppelt. Beispiel:

id date  name  s1  s2  s3  s4  min_value 
1 10/10/2017 dicky 7  24  8  11  [8]/[11] 
2 10/10/2017 acton 12  15  17  19  [17]/[19] 
3 10/10/2017 adney 28  13  19  14  [19]/[14] 
------------------------------------------------------------------ 
when total by date  47  52  44  44 

Hier Minimalwert Spalte sind s3 am s4,

ich jede Spalte erfordern innerhalb s3 or s4 es bedeutet entweder s3 oder s4 Spalt in der min_value Säule gefüllt werden.

see the problem here with sqlfiddle

ich MySQL verwende.

+1

Ihre Frage zu Sehen ist nicht klar .. – scaisEdge

+0

Sie versucht haben ** 'GROUP BY' ** Ihre Ergebnisse oder wählen Sie **' DISTINCT' ** Werte? – AlexCode

+0

Schritt 1. Speichern Sie Daten als Daten. Dann komm zurück zu uns. – Strawberry

Antwort

2

Basierend auf Ihrer SQLFiddle müssen Sie eine GROUP BY außerhalb der verschachtelten Abfragen hinzufügen, um zu erreichen, was Sie wollen.

select c.id, c.date, c.name, c.s1, c.s2, c.s3, c.s4, 
    case v.s 
     when 1 then c.s1 
     when 2 then c.s2 
     when 3 then c.s3 
     when 4 then c.s4 
    end as min_value 
from calcu c 
join (
    select date, s, sum(val) val_sum 
    from (         #unpivot your data 
     select date, s1 as val, 1 as s 
     from calcu 
     union all 
     select date, s2 as val, 2 as s 
     from calcu 
     union all 
     select date, s3 as val, 3 as s 
     from calcu 
     union all 
     select date, s4 as val, 4 as s 
     from calcu 
    ) x 
    group by date, s 
) v on c.date = v.date 
where not exists ( #we are only interested in the minimum val_sum above 
    select 1 
    from (        #note this is the same derived table as above 
     select date, s, sum(val) val_sum 
     from (
      select date, s1 as val, 1 as s 
      from calcu 
      union all 
      select date, s2 as val, 2 as s 
      from calcu 
      union all 
      select date, s3 as val, 3 as s 
      from calcu 
      union all 
      select date, s4 as val, 4 as s 
      from calcu 
     ) x 
     group by date, s 
    ) v2 
    where v2.date = v.date 
    and v2.val_sum < v.val_sum 

) GROUP BY c.id # This is the addition you need 

eine Lauf Lösung here