2009-12-23 19 views
1
CREATE TABLE exmp_test 
(
id int, 
v1 int, 
v2 int, 
v3 int, 
v4 int 
) 

SELECT * FROM exmp_test 

id v1 v2 v3 v4 
1 2 4 6 7 
1 4 77 3 8 

我想爲每行添加[id]列的值(以v1,v2,v3,v4中最小的值爲準)。例如,對於第一行,應將[id]值添加到v1(因爲它具有最低值)。對於第二行,應將[id]值添加到v3中(因爲它具有最低值)。如何獲得其中具有最小值的列

我該如何編寫SQL來執行此操作?

+0

如果連續兩列具有相同的價值,這就是最低值應發生什麼情況? – CMG 2009-12-23 13:31:05

+0

然後,我們應該去最左邊一欄。即如果v2和v4具有相同的值並且它是最小值,那麼我們將選擇v2列以添加[id]值。 – Paresh 2009-12-23 13:33:24

+1

查看http://www.sqlusa.com/bestpractices/minimum/。 **(0.5 *((@ColumnA + @ColumnB) - abs(@ColumnA - @ColumnB)))** – 2009-12-23 13:50:42

回答

2

您可以在CTE(公用表表達式)中標準化表格,然後選擇具有最小值的行。根據您的問題下面的評論,我已經爲v1添加了優先級。

;with Normal as (
    select id, v1 as value, 1 as prio from YourTable 
    union all select id, v2, 2 as prio from YourTable 
    union all select id, v3, 3 as prio from YourTable 
    union all select id, v4, 4 as prio from YourTable 
) 
select top 1 id, value 
from Normal 
where value = (
    select min(value) from Normal 
) 
order by prio 

後重新閱讀你的問題,這裏有一個方式來看待每行的最低值並添加id域至:

update t1 
set v1 = v1 + case when mincol = 1 then id else 0 end 
, v2 = v2 + case when mincol = 2 then id else 0 end 
, v3 = v3 + case when mincol = 3 then id else 0 end 
, v4 = v4 + case when mincol = 4 then id else 0 end 
from (
    select id, v1, v2, v3, v4, 
     case 
      when v1 <= v2 and v1 <= v3 and v1 <= v4 then 1 
      when v2 <= v3 and v2 <= v4 then 2 
      when v3 <= v4 then 3 
      else 4 
     end as mincol 
    from YourTable 
) t1 
+0

Thaks,這真的會幫助我! – Paresh 2009-12-23 13:40:26

+0

如何將[id]的值添加到最小值列? – Paresh 2009-12-23 14:03:17

+0

@Paresh:重新閱讀您的問題後更新的答案 – Andomar 2009-12-23 14:19:15

1

你可以做使用UVPIVOT相同

測試數據

declare @exmp_test table(id int, v1 int,v2 int,v3 int,v4 int) 
insert into @exmp_test 
select 1, 2 , 4 , 6, 7 union all 
select 1 , 4 , 77 , 3 , 8 union all 
select 2 , 4 , 16 , 1 , 8 

查詢

;with cte as(select row_number() over(order by id) as rn,t.v1 + t.v2 + t.v3 + t.v4 as sumallversions,t.* from @exmp_test t) 
    ,unpvtcte as(select rn,id as versions,vals from (select rn,[v1],[v2],[v3],[v4] from cte)t 
    unpivot (vals for id in([v1],[v2],[v3],[v4]))as unpvt) 
    update @exmp_test 
    set id = y.sumall 
    from @exmp_test e 
    join (
    select c.id,c.id + x.minvals as sumall,c.sumallversions, x.minvals from cte c 
    join(select rn,MIN(vals) minvals from unpvtcte group by rn)x on x.rn = c.rn) y 
    on y.id = e.id 
    and y.sumallversions = e.v1 + e.v2 + e.v3 + e.v4 

輸出:

id v1 v2 v3 v4 
3 2 4 6 7 
4 4 77 3 8 
3 4 16 1 8 
+0

Thnaks很多幫助 – Paresh 2009-12-24 10:54:54

相關問題