惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 【当耐特】
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Y
Y Combinator Blog
D
DataBreaches.Net
Google DeepMind News
Google DeepMind News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
云风的 BLOG
云风的 BLOG
Recorded Future
Recorded Future
I
InfoQ
L
LangChain Blog
Stack Overflow Blog
Stack Overflow Blog
Recent Announcements
Recent Announcements
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
J
Java Code Geeks
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
A
About on SuperTechFans
人人都是产品经理
人人都是产品经理
G
Google Developers Blog
大猫的无限游戏
大猫的无限游戏
C
Cybersecurity and Infrastructure Security Agency CISA
Know Your Adversary
Know Your Adversary
MongoDB | Blog
MongoDB | Blog
T
Tor Project blog
The Register - Security
The Register - Security
H
Help Net Security
Cisco Talos Blog
Cisco Talos Blog
P
Privacy & Cybersecurity Law Blog
NISL@THU
NISL@THU
P
Palo Alto Networks Blog
B
Blog RSS Feed
Latest news
Latest news
T
Threat Research - Cisco Blogs
The Hacker News
The Hacker News
C
Cisco Blogs
P
Privacy International News Feed
T
The Exploit Database - CXSecurity.com
V
Vulnerabilities – Threatpost
S
Schneier on Security
P
Proofpoint News Feed
Schneier on Security
Schneier on Security
www.infosecurity-magazine.com
www.infosecurity-magazine.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
AI
AI
Google Online Security Blog
Google Online Security Blog
H
Hacker News: Front Page
N
News and Events Feed by Topic
W
WeLiveSecurity

博客园 - AndyHai

用C#实现的黑客帝国中的字符雨特效 谁动了我的构造函数? 一个PCM音频转换与混音的示例 关心则乱 让ASPX和ASMX脱离IIS运行的例子(ASP.NET宿主程序) 带有空值提示的TextBox NAT类型检测方法(转载) 在.NET中探测U盘的插入/拔出 用WebService实现中国移动的Provision反向接口 一个动态加载/卸载DLL的例子 用ASP.NET调用Tuxedo Tuxedo 搞定! 用Multi-Media Library实现的波形音频录制与播放 用Multi-Media Library制作流式音频播放器 研究如何用Multi-Media Library播放波形数据 又多一道面试题 面试 RTP协议
SQL 中如何对纪录进行拆分
AndyHai · 2007-10-13 · via 博客园 - AndyHai

  近日在工作中,遇到一个项目,需要将SQL Server中的纪录拆分显示,也就是将一条纪录根据某种方式拆分成多条纪录。比如说在某个帐单系统中,记帐时,按照常规方式按条记;出帐时,要以0.5每纪录的方式进行拆分,即3元的帐单,要拆分成6条纪录,每条0.5元,除金额外,其它字段保持不变。
  这是个很有趣的问题,最简陋的方法莫过于使用游标,一条纪录一条纪录的分析并插入。可是,如果纪录数很多(比如上十万条帐单),那肯定是一场恶梦。如何拆分才能使效率最佳化呢?我在网上搜索了一下“SQL 纪录拆分”,竟然还真让我找到了,他用的是JOIN的方式达到拆分效果,看起来效率应该比游标高许多,不过对方是将VarChar字段用","分割进行拆分,我采取拿来主义的方法,对他的方法进行了修改,下面以上面说的帐单系统为例,细说一下:
  设定一个帐单基本值,此值即每条出帐纪录的金额。在SELECT中,将帐单的金额减去此基本值乘以一个有限序列数i,其结果可用来表示第i条出帐单的剩余金额,如果得数大于等于0,表示还有剩余的金额,出帐纪录有效;若是小于0,则意味着剩余金额不足,出帐纪录无效。有效的出帐纪录中的金额自然等于帐单基本值,不过这里面还有几个问题:
1、这里只考虑了帐单金额可以被帐单基本值整除的情况,这种情况下,假如帐单基本值是0.5元,自然是每条出帐单0.5元;而假若帐单是3.2元,帐单基本值是0.5元,那么最后一条帐单纪录肯定不是0.5元而是0.2元,所以还需要判断一下剩余金额是否大于0小于帐单基本值,如果是,则剩余金额就是该条出帐单的金额。
2、有限的序列数i,如何产生有限序列数?方法很多,创建一个临时表(或者表变量),1、2、3、4、5……一条一条插入即可产生序列数啦。另一个方法比较有趣,使用某个系统表中的纪录做引子,产生序列数。
  下面是SQL示例:

DECLARE @BaseValue AS INT --帐单基本值

SET @BaseValue = 50

DECLARE @Fee TABLE (ID INT IDENTITY(11), Name VARCHAR(32), Fee INT, FeeTime DATETIME)
INSERT INTO @Fee VALUES ('Andy'300'2007-01-01 10:22:42')
INSERT INTO @Fee VALUES ('John'300'2007-01-01 10:22:32')
INSERT INTO @Fee VALUES ('Lara'310'2007-01-01 10:22:22')
INSERT INTO @Fee VALUES ('Philip'240'2007-01-01 10:22:52')

DECLARE @Tmp TABLE(ID INT IDENTITY(01), A INT--序列数表(必须从0开始)

INSERT INTO @Tmp (A)
    
SELECT NULL FROM sys.columns --用系统表做引子,产生序列数

SELECT 
F.ID, F.Name, 
'Fee' = 
    
CASE
        
WHEN Fee - @BaseValue * T.ID >= @BaseValue THEN @BaseValue
        
ELSE Fee - @BaseValue * T.ID
    
END,
FeeTime
FROM @Fee AS F INNER JOIN @Tmp AS T ON Fee - @BaseValue * T.ID > 0 ORDER BY F.ID, T.ID