仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 728|回复: 9
打印 上一主题 下一主题

[学习教程] MSSQL教程之关于论坛上谁人SQL微软口试题。我的解答...

[复制链接]
简单生活 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:27:40 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
支持多种存储引擎。解答|微软
成绩:

一百个账户各有100$,某个账户某天若有付出则增加一条新纪录,纪录其他额。一百天后,请输入天天一切账户的余额信息


这个成绩的难点在于每一个用户在某天大概有多条记录,也大概一条记录也没有(不包含第一天)

前往的纪录集是一个100天*100个用户的记录集

上面是我的思绪:

1.创立表并拔出测试数据:我们请求username从1-100
CREATETABLE[dbo].[TABLE2](
[username][varchar](50)NOTNULL,--用户名
[outdate][datetime]NOTNULL,--日期
[cash][float]NOTNULL--余额
)ON[PRIMARY

declare@iint
set@i=1
while@i<=100
begin
inserttable2values(convert(varchar(50),@i),2001-10-1,100)
inserttable2values(convert(varchar(50),@i),2001-11-1,50)
set@i=@i+1
end
inserttable2values(convert(varchar(50),@i),2001-10-1,90)

select*fromtable2orderbyoutdate,convert(int,username)

2.组合查询语句:
a.我们必需前往一个从第一天入手下手到100天的记录集:
如:2001-10-1(这个日期是恣意的)到2002-1-8
因为第一天是恣意一天,以是我们必要上面的SQL语句:
selecttop100dateadd(d,convert(int,username)-1,min(outdate))asoutdate
fromtable2
groupbyusername
orderbyconvert(int,username)
这里的奇妙在于:
convert(int,username)-1(记得我们指定用户名从1-100:-))
groupbyusername,min(outdate):第一天便可能每一个用户有多个记录。
前往的了局:
outdate
------------------------------------------------------
2001-10-0100:00:00.000
.........
2002-01-0800:00:00.000

b.前往一个一切用户名的记录集:
selectdistinctusernamefromtable2
前往了局:
username
--------------------------------------------------
1
10
100
......
99

c.前往一个100天纪录集和100个用户纪录集的笛卡尔汇合:
select*from
(
selecttop100dateadd(d,convert(int,username)-1,min(outdate))asoutdate
fromtable2
groupbyusername
orderbyconvert(int,username)
)asA
CROSSjoin
(
selectdistinctusernamefromtable2
)asB
orderbyoutdate,convert(int,username)
前往了局100*100条记录:
outdateusername
2001-10-0100:00:00.0001
......
2002-01-0800:00:00.000100

d.前往以后一切用户在数据库的有的记录:
selectoutdate,username,min(cash)ascashfromtable2
groupbyoutdate,username

orderbyoutdate,convert(int,username)
前往记录:
outdateusernamecash
2001-10-0100:00:00.000190
......
2002-01-0800:00:00.00010050

e.将c中前往的笛卡尔集和d中前往的记录做leftjoin:
selectC.outdate,C.username,
D.cash
from
(
select*from
(
selecttop100dateadd(d,convert(int,username)-1,min(outdate))asoutdate
fromtable2
groupbyusername
orderbyconvert(int,username)
)asA
CROSSjoin
(
selectdistinctusernamefromtable2
)asB
)asC
leftjoin
(
selectoutdate,username,min(cash)ascashfromtable2
groupbyoutdate,username
)asD
on(C.username=D.usernameanddatediff(d,C.outdate,D.outdate)=0)

orderbyC.outdate,convert(int,C.username)
注重:用户在当天假如没有记录,cash字段前往NULL,不然cash前往每一个用户当天的余额
outdateusernamecash
2001-10-0100:00:00.000190
2001-10-0100:00:00.0002100
......
2001-10-0200:00:00.000190
2001-10-0200:00:00.0002NULL<--注重这里
......

2002-01-0800:00:00.00010050

f.好了,如今我们最初要做的就是,假如cash为NULL,我们要前往小于以后记录日期的第一个用户余额(因为我们利用orderbycash,以是前往top1记录便可,利用min应当也能够),这个余额即为以后的余额:
caseisnull(D.cash,0)
when0then
(
selecttop1cashfromtable2wheretable2.username=C.username
anddatediff(d,C.outdate,table2.outdate)<0
orderbytable2.cash
)
elseD.cash
endascash

g.最初组合的完全语句就是
selectC.outdate,C.username,
caseisnull(D.cash,0)
when0then
(
selecttop1cashfromtable2wheretable2.username=C.username
anddatediff(d,C.outdate,table2.outdate)<0
orderbytable2.cash
)
elseD.cash
endascash
from
(
select*from
(
selecttop100dateadd(d,convert(int,username)-1,min(outdate))asoutdate
fromtable2
groupbyusername
orderbyconvert(int,username)
)asA
CROSSjoin
(
selectdistinctusernamefromtable2
)asB
)asC
leftjoin
(
selectoutdate,username,min(cash)ascashfromtable2
groupbyoutdate,username
)asD
on(C.username=D.usernameanddatediff(d,C.outdate,D.outdate)=0)

orderbyC.outdate,convert(int,C.username)

前往了局:
outdateusernamecash
2001-10-0100:00:00.000190
2001-10-0100:00:00.0002100
......
2002-01-0800:00:00.00010050

人人看看另有没甚么bug,假如你发明bug大概你有更好的办法,你大概发邮件给我:hydnoahark@netease.com^-^

提供多语言支持,常见的编码如中文的GB2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名。
变相怪杰 该用户已被删除
10#
发表于 2015-3-21 19:34:36 | 只看该作者
大家注意一点。如下面的例子:
金色的骷髅 该用户已被删除
9#
发表于 2015-3-15 05:45:44 | 只看该作者
以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了
飘灵儿 该用户已被删除
8#
发表于 2015-3-7 12:37:47 | 只看该作者
发几份SQL课件,以飨阅者
飘飘悠悠 该用户已被删除
7#
发表于 2015-2-24 15:32:15 | 只看该作者
对于数据库来说,查询是数据库的灵魂,那么SQL查询效率究竟效率如何呢?下文将带对SQL查询的相关问题进行讨论,供您参考。
莫相离 该用户已被删除
6#
发表于 2015-2-8 05:56:51 | 只看该作者
至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。
老尸 该用户已被删除
5#
发表于 2015-2-2 20:25:25 | 只看该作者
原来公司用过MYSQL自己也只是建个表写个SQL
愤怒的大鸟 该用户已被删除
地板
发表于 2015-2-2 20:25:25 来自手机 | 只看该作者
还不是性能有问题!否则面向对象的数据库早就实现了!建议使用CLR的地方一般是和应用的复杂程度或操作系统环境有很高的耦合度的场景。如你想构建复杂的算法,并且用到了大量的指针和高级数据模型。
谁可相欹 该用户已被删除
板凳
发表于 2015-1-25 08:43:30 | 只看该作者
其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。
第二个灵魂 该用户已被删除
沙发
发表于 2015-1-19 13:16:37 | 只看该作者
而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 04:56

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表