2017-10-12 126 views
1

我有一個表名爲calcuSQL列計算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 

這裏作爲最小的列的值是s2 [32],這就是爲什麼s2值= min_value柱。

check sqlfiddle here

現在是沒有問題的。但是,如果s1, s2, s3, s4值中的任何字段的值等於[see below example]並且包含任何字段,則min_value字段會翻倍並且所有列翻倍。 實施例:

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 

這裏最小值列s3 ANS s4

我需要s3 or s4內它意味着要麼s3s4列將在min_value柱被填充任何列。

see the problem here with sqlfiddle

我使用MySQL。

+1

您的問題沒有明確的.. – scaisEdge

+0

你試圖**'GROUP BY' **你的結果,或選擇**'DISTINCT' **值? – AlexCode

+0

第1步。以日期存儲日期。然後回到我們身邊。 – Strawberry

回答

2

根據你的sqlfiddle,你需要在嵌套查詢之外添加一個GROUP BY來實現你想要的。

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 

,瞭解運行的解決方案here