zjcxc(邹建)的Blog - SQL Server

引用或者转载本BLOG的文章请注明原作者和出处,并保留原文章中的版权信息。谢谢!

用户操作
[即时聊天] [发私信] [加为好友]
邹建ID:zjcxc
487114次访问,排名95好友186人,关注者1069
没有什么好介绍的
zjcxc的文章
原创 151 篇
翻译 0 篇
转载 9 篇
评论 525 篇
邹建的公告
嗨,您好!欢迎到zjcxc(邹建)的Blog

引用或者转载本BLOG的文章请注明原作者和出处,并保留原文章中的版权信息

《深入浅出——SQL Server 2005开发、管理与应用实例》 正式发行

中国互动出版社 当当网 销售商列表

最近评论
netcup:似乎群集只是提供了热备,并不能达到负载均衡的目的,记得好像是这样的,请老大指正。
claro:看了您写的文章,颇有感悟,THX!
chenjing957:我不是老邹哦,但你的问题是可以搞定的,用脚本控制,用一串case和if_else就行,如果是把大于65535行的表导入excel2003的话,还是需要考虑分页。office2007不用考虑这个。
bruli:很好的教材,用了3天时间做了一遍

遇到一些问题,最后都解决了
第一次安装 MSDTC在node1上,此服务无法启动,卸载重装,依然不行。我干脆把那个node1节点停掉,在另一节点上重新安装MSDTC,成功。然后重新制作node1,再把它加入cluster,运行正常。

在node3安装SQL01,SQL02成功,但在将SQL01的管理权交给……
josy:邹老大,多个表导入一个excel文件的多个sheet里,可以吗?
文章分类
收藏
相册
我的女儿
我写的书
《中文版SQL Server 2000开发与管理应用实例》源代码下载
《深入浅出——SQL Server 2005开发、管理与应用实例》 - 当当网
《深入浅出——SQL Server 2005开发、管理与应用实例》- 中国互动出版社
学习资源
T-SQL脚本中心
教程在线
自建网站
先知电脑有限公司
存档
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 在有限多的不大于100的正整数中,找出尽量多个相加起来值介于98~102之间的组合收藏

新一篇: 实现删除主表数据时, 判断与之关联的外键表是否有数据引用, 有标志, 无则删除 | 旧一篇: SELECT 赋值与ORDER BY冲突的问题

 

问题描述:

在有限多的不大于100的正整数中,找出尽量多个相加起来值介于98102之间的组合。

组合的个数限制在2 3

比如有数字(39401551717……N)数字可以有重复。

找出的组合有(5050),(214139),(4850)……M。在上面的数字在组合中每次只能出现一次(比如数字中40只出现过一次,那在组合中也只能出现一次。17出现过两次那在组合中最多两次)

 

实现现代码

-- 测试数据, value 列放要处理的数(此处随机生成100个数据)

DECLARE @t TABLE(

    id int identity,

    value int)

INSERT @t SELECT TOP 100 CHECKSUM(NEWID()) % 100 FROM syscolumns

 

--=====================================================

-- 组合处理

--=====================================================

DECLARE @r TABLE(

    id int IDENTITY,

    vs varchar(100))

DECLARE @tid TABLE(id int PRIMARY KEY)

 

IF OBJECT_ID('tempdb..#1') IS NOT NULL

    DROP TABLE #1

SELECT

    id1 = A.id, value1 = A.value,

    id2 = B.id, value2 = B.value,

    value = A.value + B.value,

    flag = CASE WHEN A.value + B.value BETWEEN 98 AND 102 THEN 1 ELSE 0 END

INTO #1

FROM @t A, @t B

WHERE A.id < B.id

 

DECLARE tb CURSOR STATIC LOCAL

FOR

SELECT id1, id2, id3, vs

FROM(

    -- 二次组合的

    SELECT flag = 2,

        A.id1, A.id2, id3 = NULL,

        vs = RTRIM(A.value1) + ',' + RTRIM(A.value2)

    FROM #1 A

    WHERE flag = 1

    UNION ALL

    -- 三次组合的

    SELECT flag = 3,

        A.id1, A.id2, id3 = B.id,

        RTRIM(A.value1) + ',' + RTRIM(A.value2) + ',' + RTRIM(B.value)

    FROM #1 A, @t B

    WHERE A.id2 < B.id

        AND A.value + B.value BETWEEN 98 AND 102

)A

ORDER BY flag DESC

 

-- 仅选出复合需求的数据(过滤重复数据)

DECLARE @id1 int, @id2 int, @id3 int, @values varchar(100)

OPEN tb

FETCH tb INTO @id1, @id2, @id3, @values

WHILE @@ROWCOUNT > 0

BEGIN

    IF NOT EXISTS(

            SELECT * FROM @tid WHERE id IN(@id1, @id2, @id3))

    BEGIN

        INSERT @r VALUES(@values)

        INSERT @tid SELECT *

        FROM(

            SELECT id = @id1 UNION ALL SELECT @id2 UNION ALL SELECT @id3

        )A WHERE id > 0

    END

    FETCH tb INTO @id1, @id2, @id3, @values

END

CLOSE tb

DEALLOCATE tb

 

-- 显示结果

SELECT vs FROM @r

发表于 @ 2006年09月17日 21:00:00|评论(loading...)|编辑

新一篇: 实现删除主表数据时, 判断与之关联的外键表是否有数据引用, 有标志, 无则删除 | 旧一篇: SELECT 赋值与ORDER BY冲突的问题

评论

#蛋蛋 发表于2006-09-18 01:13:00  IP: 74.116.36.*
楼主高!我最近也在研究怎么用SQL+Stored Procedure写一个3D游戏引擎,以及用SQL写一个数值计算包。数值计算包支持自己的DSL,所以我也正在用SQL写一个DSL编译器。因为那些什么lex阿,yacc阿,antlr阿,都不支持SQL(说实话,用什么Java/C++哪里有用SQL简单清爽,对吧?),所以我正在用SQL写lexer和parser。后来的code generator自然也在计划之内。生成的代码自然也是SQL了。SQL才是王道啊!!
#blood 发表于2006-09-18 13:21:00  IP: 219.127.69.*
经过运行,在sql 2000中运行得出的结果是错误的,不知道楼主经过测试没有。失望。。。。
#大圣 发表于2006-09-30 11:20:00  IP: 60.191.28.*
sql 2000里运行正确的啊
#Teng 发表于2006-11-01 11:10:00  IP: 218.249.78.*
老大,在sql server2005上不正确啊
里面还有负数呢
#天命执行官 发表于2006-11-07 22:11:00  IP: 219.134.145.*
这个应该比较简单吧,做个笛卡儿积,再选出符合条件的每一条就可以啦

create table Tvalue
(
val int)

select a.val, b.val, c.val
from Tvalue a, Tvalue b, Tvalue c
where a.val + b.val + c.val BETWEEN 98 AND 102

没有测试过,不知道语法对不,原理上应该行得通
#hunhun02 发表于2007-01-10 16:19:38  IP: 219.238.247.*
题目也没说不能有负数啊
这个是题目的问题
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © 邹建