2017-10-12 14 views
1

J'ai une table nommée calcucalcul de la colonne SQL valeur mininimum

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 

Ici comme valeur minimale de la colonne est s2 [32], c'est pourquoi s2 valeur = colonne min_value.

check sqlfiddle here

Maintenant, il n'y a pas de problème. Mais lorsque l'un des champs de la valeur s1, s2, s3, s4 est égal à [see below example] avec n'importe quel champ, le champ min_value double et toutes les colonnes sont doublées. Exemple:

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 

colonnes de valeur ici minimales sont s3 ans s4,

-je besoin d'colonne dans s3 or s4 cela signifie soit s3 ou s4 colonne sera rempli dans la colonne min_value.

see the problem here with sqlfiddle

J'utilise MySQL.

+1

votre question n'est pas clair .. – scaisEdge

+0

Avez-vous essayé de ** 'GROUPE BY' ** vos résultats, ou sélectionnez **' DISTINCT' ** valeurs? – AlexCode

+0

Étape 1. Stockez les dates sous forme de dates. Puis revenez nous voir. – Strawberry

Répondre

2

En fonction de votre sqlfiddle, vous devez ajouter un GROUP BY en dehors des requêtes imbriquées afin de réaliser ce que vous voulez.

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 

Voir une solution de fonctionnement here