[推荐] MSSQL多列取最大或者最小值 --整理帖 30wufeng4552]

发布时间:2014-1-1 0:09:47编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"[推荐] MSSQL多列取最大或者最小值 --整理帖 30wufeng4552]",主要涉及到[推荐] MSSQL多列取最大或者最小值 --整理帖 30wufeng4552]方面的内容,对于[推荐] MSSQL多列取最大或者最小值 --整理帖 30wufeng4552]感兴趣的同学可以参考一下。

  /* lvl1  lvl2    lvl3    lvl4    lvl  4      3      4      1         3      2      2      1     2      2      3      4  4      4      3      4  3      1      2      2  怎么写代码 去比较lvl1、lvl2、lvl3、lvl4 对应每行的值,取其中最小的,将其值添加到lvl列里  运行结果应该是  lvl  1  1  2  3  1 */ --方法(一) 函數法 -->Title:Generating test data -->Author:wufeng4552 -->Date :2009-10-16 09:58:16 if not object_id('Tempdb..#t') is null     drop table #t Go Create table #t([lvl1] int,[lvl2] int,[lvl3] int,[lvl4] int,[lvl] int) Insert #t select 4,3,4,1,null union all select 3,2,2,1,null union all select 2,2,3,4,null union all select 4,4,3,4,null union all select 3,1,2,2,null Go if object_id('UF_minget')is not null drop function UF_minget go create function UF_minget (@col1 int,@col2 int,@col3 int,@col4 int) returns int as   begin      declare @t table(col int)      insert @t select @col1 union all                select @col2 union all                select @col3 union all                select @col4      return(select min(col)from @t)   end go update t set [lvl]=dbo.UF_minget([lvl1],[lvl2],[lvl3],[lvl4]) from #t t select * from #t /* lvl1        lvl2        lvl3        lvl4        lvl ----------- ----------- ----------- ----------- ----------- 4           3           4           1           1 3           2           2           1           1 2           2           3           4           2 4           4           3           4           3 3           1           2           2           1 (5 個資料列受到影響) */ --方法二  MSSQL2005 XML PATH ------------------------------------- --  Author : liangCK 梁爱兰 --  Comment: 小梁 爱 兰儿 --  Date   : 2009-10-16 09:57:38 ------------------------------------- --> 生成测试数据: @T DECLARE @T TABLE (lvl1 int,lvl2 int,lvl3 int,lvl4 int,lvl int) INSERT INTO @T SELECT 4,3,4,1,null UNION ALL SELECT 3,2,2,1,null UNION ALL SELECT 2,2,3,4,null UNION ALL SELECT 4,4,3,4,null UNION ALL SELECT 3,1,2,2,null --SQL查询如下: UPDATE A SET     lvl = B.x.value('min(//row/*)','int') FROM @T AS A     CROSS APPLY (SELECT x = (SELECT A.* FOR XML PATH('row'),TYPE)) AS B;      SELECT * FROM @T; /* lvl1        lvl2        lvl3        lvl4        lvl ----------- ----------- ----------- ----------- ----------- 4           3           4           1           1 3           2           2           1           1 2           2           3           4           2 4           4           3           4           3 3           1           2           2           1 (5 行受影响) */ --方法(三) 作者 (四方城)  if object_id('[tb]') is not null drop table [tb] go create table [tb]([lvl1] int,[lvl2] int,[lvl3] int,[lvl4] int,[lvl] int) insert [tb] select 4,3,4,1,null union all select 3,2,2,1,null union all select 2,2,3,4,null union all select 4,4,3,4,null union all select 3,1,2,2,null go create function getmin(@a varchar(8000))      returns int      as      begin declare @ table (id int identity,a char(1))          declare @t int          insert @ select top 8000 null from sysobjects a,sysobjects b          select @t=min(cast(substring(','[email protected],id+1,charindex(',',','[email protected]+',',id+1)-id-1) as int))          from @ where substring(','[email protected],id,8000) like ',_%'          return @t      end    go -->查询 select    lvl1,   lvl2,   lvl3,   lvl4,   lvl=dbo.getmin(ltrim(lvl1)+','+ltrim(lvl2)+','+ltrim(lvl3)+','+ltrim(lvl4)) from tb /** lvl1        lvl2        lvl3        lvl4        lvl ----------- ----------- ----------- ----------- ----------- 4           3           4           1           1 3           2           2           1           1 2           2           3           4           2 4           4           3           4           3 3           1           2           2           1 (5 行受影响) **/ --方法(四) -->Title:Generating test data -->Author:wufeng4552 -->Date :2009-10-16 09:58:16   if not object_id('Tempdb..#t') is null     drop table #t Go Create table #t([lvl1] int,[lvl2] int,[lvl3] int,[lvl4] int,[lvl] int) Insert #t select 4,3,4,1,null union all select 3,2,2,1,null union all select 2,2,3,4,null union all select 4,4,3,4,null union all select 3,1,2,2,null Go if object_id('UF_minget')is not null drop function UF_minget go create function UF_minget (@s varchar(200)) returns int as   begin   return(     select col=min(substring(@s,number,charindex(',',@s+',',number)-number))     from master..spt_values     where type='p' and number<=len(@s+'a') and charindex(',',','[email protected],number)=number)   end go select    [lvl1],   [lvl2],   [lvl3],   [lvl4],   [lvl]=dbo.UF_minget(ltrim([lvl1])+','+ltrim([lvl2])+','+ltrim([lvl3])+','+ltrim([lvl4])) from #T /* lvl1        lvl2        lvl3        lvl4        lvl ----------- ----------- ----------- ----------- ----------- 4           3           4           1           1 3           2           2           1           1 2           2           3           4           2 4           4           3           4           3 3           1           2           2           1 */  --方法(五) -->Title:Generating test data -->Author:wufeng4552 -->Date :2009-10-16 09:58:16 if not object_id('Tempdb..#t') is null     drop table #t Go Create table #t([lvl1] int,[lvl2] int,[lvl3] int,[lvl4] int,[lvl] int) Insert #t select 4,3,4,1,null union all select 3,2,2,1,null union all select 2,2,3,4,null union all select 4,4,3,4,null union all select 3,1,2,2,null Go select [lvl1],        [lvl2],        [lvl3],        [lvl4],        [lvl]=(select min([lvl1])               from (select [lvl1]                    union all select [lvl2]                    union all select [lvl3]                    union all select [lvl4])T) from #t /* lvl1        lvl2        lvl3        lvl4        lvl ----------- ----------- ----------- ----------- ----------- 4           3           4           1           1 3           2           2           1           1 2           2           3           4           2 4           4           3           4           3 3           1           2           2           1 (5 個資料列受到影響) */ 更多方法,請跟帖討論

支持!

学习。

好帖

学习!

这。。。。

技术帖,还是水帖

上榜了,嘿嘿...今天也特别留意到了这个帖子,准备发博的,没想到水哥这么快就整理出来了 膜拜一下水哥...

很好,我以后要靠这个代码赚分了 

抄袭到BLOG里面去

引用 6 楼 happyflystone 的回复:技术帖,还是水帖 你看它是技術帖 它就是技術帖 你看它是水帖 它自然是水帖

引用 10 楼 wufeng4552 的回复:引用 6 楼 happyflystone 的回复: 技术帖,还是水帖 你看它是技術帖 它就是技術帖 你看它是水帖 它自然是水帖 SF没抢成,有点希望是水帖呀

学习

引用 11 楼 happyflystone 的回复:引用 10 楼 wufeng4552 的回复: 引用 6 楼 happyflystone 的回复: 技术帖,还是水帖 你看它是技術帖 它就是技術帖 你看它是水帖 它自然是水帖 SF没抢成,有点希望是水帖呀 那我發个300的 你搶?

多谢水哥对新技术前沿的支持 哈哈

引用 11 楼 happyflystone 的回复:引用 10 楼 wufeng4552 的回复: 引用 6 楼 happyflystone 的回复: 技术帖,还是水帖 你看它是技術帖 它就是技術帖 你看它是水帖 它自然是水帖 SF没抢成,有点希望是水帖呀 你的意思是让水哥重发?

什么情况下有可能用到这种实例?请楼主说下。。

学习

引用 16 楼 xuejidong 的回复:什么情况下有可能用到这种实例?请楼主说下。。 比如说,你考试考了10科,通过这个实例,可以查到哪科是你最痛恨的

引用 13 楼 wufeng4552 的回复:引用 11 楼 happyflystone 的回复: 引用 10 楼 wufeng4552 的回复: 引用 6 楼 happyflystone 的回复: 技术帖,还是水帖 你看它是技術帖 它就是技術帖 你看它是水帖 它自然是水帖 SF没抢成,有点希望是水帖呀 那我發个300的 你搶? 重来

如果用到存储过程或是函数就没意思了. 还不如用程序写呢.

.......

引用 20 楼 dawugui 的回复:如果用到存储过程或是函数就没意思了. 还不如用程序写呢. 更多方法,請跟帖討論

也发一个,以示对水哥的支持 /***测试数据***/  if object_id('[tb]') is not null drop table [tb]  go  create table [tb]([学生号] int,[语文] int,[数学] int,[英语] int,[物理] int,[化学] int)  insert [tb]  select 1001,89,98,87,63,70 union all  select 1002,81,87,79,97,87 union all  select 1003,65,86,65,87,84 union all  select 1004,87,82,89,84,76 union all  select 1005,76,76,87,79,75 union all  select 1006,90,68,67,94,90 union all  select 1007,56,65,86,69,77 union all  select 1008,78,100,83,86,93  /***查询***/   select     学生号,    语文,    数学,    英语,    物理,    化学,    (select max(t.a) from (select 语文 as a union select 数学 union select 英语 union select 物理 union select 化学) t) as [最高分],    (select min(t.a) from (select 语文 as a union select 数学 union select 英语 union select 物理 union select 化学) t) as [最低分]  from tb  /***结果***/  学生号      语文        数学         英语       物理       化学      最高分   最低分           ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------   1001        89          98          87          63          70          98          63  1002        81          87          79          97          87          97          79  1003        65          86          65          87          84          87          65  1004        87          82          89          84          76          89          76  1005        76          76          87          79          75          87          75  1006        90          68          67          94          90          94          67  1007        56          65          86          69          77          86          56  1008        78          100         83          86          93          100         78  (所影响的行数为 8 行

汗..跟水哥的方法五撞上了,这是我唯一写的一篇blog,以前写的

引用 24 楼 josy 的回复:汗..跟水哥的方法五撞上了,这是我唯一写的一篇blog,以前写的 这叫英雄所见略同 

好帖~

顶楼猪

Mark!

感觉是简单问题复杂化了,下面这样应该也可以 if not object_id('Tempdb..#t') is null     drop table #t Go Create table #t([lvl1] int,[lvl2] int,[lvl3] int,[lvl4] int,[lvl] int) Insert #t select 4,3,4,1,null union all select 3,2,2,1,null union all select 2,2,3,4,null union all select 4,4,3,4,null union all select 3,1,2,2,null select case when lvl1<=lvl2 and lvl1<=lvl3 and lvl1<=lvl4 then lvl1 when lvl2<=lvl1 and lvl2<=lvl3 and lvl2<=lvl4 then lvl2 when lvl3<=lvl1 and lvl3<=lvl2 and lvl3<=lvl4 then lvl3 when lvl4<=lvl1 and lvl4<=lvl2 and lvl4<=lvl3 then lvl4 end  from #t select * from #t drop table #t

学习。。。

update @lagete id full(id as 1 and name as 2)

学习

方法1,5 最简洁明了

不是太明白

不错 

还行

该回复于2009-10-19 10:35:19被版主删除

学习

身为菜鸟 我们是来学习的

如果用到存储过程或是函数就没意思了.  还不如用程序写呢.

也是来学习的。

up

好!

下午给了一个跟水哥的方法五是一样的,为了再次支持水哥,再写一个函数嵌套的吧 -->测试数据 if object_id('[tb]') is not null drop table [tb] go create table [tb]([lvl1] int,[lvl2] int,[lvl3] int,[lvl4] int,[lvl] int) insert [tb] select 4,3,4,1,null union all select 3,2,2,1,null union all select 2,2,3,4,null union all select 4,4,3,4,null union all select 3,1,2,2,null go -->函数:返回两个数中值较小的数 if object_id('F_GetMin')is not null drop function F_GetMin go CREATE FUNCTION F_GetMin (      @arg1   AS   int,      @arg2   AS   int    )    RETURNS   int    AS     BEGIN      RETURN CASE               WHEN @arg1<[email protected] THEN @arg1               WHEN @arg1>@arg2 THEN  @arg2               ELSE   NULL             END    END    GO    -->查询 SELECT    lvl1,   lvl2,   lvl3,   lvl4,   lvl=dbo.f_getmin(dbo.f_getmin(dbo.f_getmin(lvl1,lvl2),lvl3),lvl4) --函数嵌套 FROM   tb -->结果 /** lvl1        lvl2        lvl3        lvl4        lvl ----------- ----------- ----------- ----------- ----------- 4           3           4           1           1 3           2           2           1           1 2           2           3           4           2 4           4           3           4           3 3           1           2           2           1 (5 行受影响) **/

看不太明白,,怎么没解释下的?

ddddddddddddddddddddddddddddddd

xue 

DING 

来学习的

是来学习的。

wo yao chao xi

受教啦。谢谢楼主的整理。

关注中......

学习学习!

好帖

dsfdd

好帖

d

hehe

bu cuo hai hao

好长啊

什么啊

支持水哥

引用 47 楼 josy 的回复:下午给了一个跟水哥的方法五是一样的,为了再次支持水哥,再写一个函数嵌套的吧 SQL code-->测试数据ifobject_id('[tb]')isnotnulldroptable[tb]gocreatetable[tb]([lvl1]int,[lvl2]int,[lvl3]int,[lvl4]int,[lvl]int)insert[tb]select4,3,4,1,nullunionallselect3,2,2,1,nullunionallselect2,2,3,4,nullunionallselect4,4,3,4,nullunionallselect3,1,2,2,nullgo-->函数:返回两个数中值较小的数ifobject_id('F_GetMin')isnotnulldropfunction F_GetMingoCREATEFUNCTION F_GetMin (@arg1ASint,@arg2ASint    )[email protected]<[email protected]@[email protected]>@[email protected]>查询SELECT    lvl1,   lvl2,   lvl3,   lvl4,   lvl=dbo.f_getmin(dbo.f_getmin(dbo.f_getmin(lvl1,lvl2),lvl3),lvl4)--函数嵌套FROM   tb-->结果 /** lvl1        lvl2        lvl3        lvl4        lvl ----------- ----------- ----------- ----------- ----------- 4           3           4           1           1 3           2           2           1           1 2           2           3           4           2 4           4           3           4           3 3           1           2           2           1 (5 行受影响) **/ 頂樹哥的.

该回复于2009-10-17 13:52:58被版主删除

好东西,顶

看看啊我来也谢谢了

拿分就走 下载东西

学习

引用楼主 wufeng4552 的回复: 更多方法,請跟帖討論

学习。

学习。

刷分中

学习。

学习一下

非常感谢 学习了

学习了看不懂

ding

不懂,太深奥了

学习  学习  谢谢

菜鸟看过

好东西,收了  ..

好帖,学习一下

顶一个

一样的结果......

歇息了

树人的方法好强大

好东西 学习一下 

比较专业,学习学习

比较好 支持

挺好的

真好

我面试就做这套题。。我用临时表的。。然后再select

jf

支持

达人 不错  谢谢 !!!!!

很需要这个。。xiexie!!!!!!!


上一篇:关于使用SQL Server2008的Database Mail发送邮件,如何设置SMTP的问题. 20aqbeyond]
下一篇:關于刪除SQL2005日誌,對數據庫複製技術有沒影響 40builderwfy]

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款