首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

SQL SEVER 如何取三列数据的最大者

2013-11-29 
SQL SEVER 怎么取三列数据的最大者inf2232_pay1, inf2234_pay3, inf2235_pay4code 1020300011006080002 20

SQL SEVER 怎么取三列数据的最大者
inf2232_pay1   , inf2234_pay3  , inf2235_pay4   code 
10                20               30            001
100                60               80           002 
20                90                 10          003
将inf2232_pay1   , inf2234_pay3  , inf2235_pay4  比较后得出其最大值,如下结果

inf2232_pay1   , inf2234_pay3  , inf2235_pay4   code 
0                 0                30            001
100               0                0             002 
0                 90               0             003

[解决办法]
case when
[解决办法]


create table af
(inf2232_pay1 int,inf2234_pay3 int,inf2235_pay4 int,code varchar(10))

insert into af
 select 10,20,30,'001' union all
 select 100,60,80,'002' union all
 select 20,90,10,'003'


update af
 set inf2232_pay1=case when inf2232_pay1>inf2234_pay3 and inf2232_pay1>inf2235_pay4
                       then inf2232_pay1 else 0 end,
     inf2234_pay3=case when inf2234_pay3>inf2232_pay1 and inf2234_pay3>inf2235_pay4
                       then inf2234_pay3 else 0 end,
     inf2235_pay4=case when inf2235_pay4>inf2232_pay1 and inf2235_pay4>inf2234_pay3
                       then inf2235_pay4 else 0 end

select * from af

/*
inf2232_pay1 inf2234_pay3 inf2235_pay4 code
------------ ------------ ------------ ----------
0            0            30           001
100          0            0            002
0            90           0            003

(3 row(s) affected)
*/

[解决办法]
是这样吗:


;with t(inf2232_pay1   , inf2234_pay3  , inf2235_pay4  , code)
as

select 10 ,  20,  30, '001'
union all select 100,  60, 80,  '002' 
union all select 20, 90,  10,  '003'
)

select case when inf2232_pay1> inf2234_pay3
                 and inf2232_pay1> inf2235_pay4
                 then inf2232_pay1
            else 0 end as inf2232_pay1,
            
      case when inf2234_pay3> inf2232_pay1
                 and inf2234_pay3> inf2235_pay4


                 then inf2234_pay3
            else 0 end as inf2234_pay3,  
            
      case when inf2235_pay4> inf2234_pay3
                 and inf2235_pay4> inf2232_pay1
                 then inf2235_pay4
            else 0 end as inf2235_pay4, 
      code         
from t
/*
inf2232_pay1inf2234_pay3inf2235_pay4code
0030001
10000002
0900003
*/


[解决办法]
--> 测试数据:#tb
IF OBJECT_ID('tempdb.dbo.#tb') IS NOT NULL DROP TABLE #tb
GO 
CREATE TABLE #tb([inf2232_pay1] INT,[inf2234_pay3] INT,[inf2235_pay4] INT,[code] VARCHAR(3))
INSERT #tb
SELECT 10,20,30,'001' UNION ALL
SELECT 100,60,80,'002' UNION ALL
SELECT 20,90,10,'003'
--------------开始查询--------------------------
;WITH cte AS(
SELECT max_value=B.x.value('max(//row/*)','int')
,[code]
FROM #tb AS A
    CROSS APPLY (SELECT x = (SELECT A.[inf2232_pay1],a.[inf2234_pay3],a.[inf2235_pay4] FOR XML PATH('row'),TYPE)) AS B
    )
    SELECT CASE WHEN [inf2232_pay1]=c.max_value THEN [inf2232_pay1] ELSE 0 END 
     ,CASE WHEN [inf2234_pay3]=c.max_value THEN [inf2234_pay3] ELSE 0 END 
     , CASE WHEN [inf2235_pay4]=c.max_value THEN [inf2235_pay4] ELSE 0 END 
      ,T.[code]
     FROM #tb t, cte c WHERE c.[code]=t.[code]
    
----------------结果----------------------------
/* 
0030001
10000002
0900003
*/



[解决办法]
参考:http://blog.csdn.net/stublue/article/details/14486887

热点排行