全球旧事资料 分类
ectfromtable2orderbyoutdateco
verti
tuser
ame
2组合查询语句:a我们必须返回一个从第一天开始到100天的纪录集:如:2001101(这个日期是任意的)到200218由于第一天是任意一天,所以我们需要下面的SQL语句:selecttop100dateadddco
verti
tuser
ame1mi
outdateasoutdatefromtable2groupbyuser
ameorderbyco
verti
tuser
ame这里的奥妙在于:co
verti
tuser
ame1(记得我们指定用户名从1100groupbyuser
amemi
outdate第一天就可能每个用户有多个纪录。返回的结果:outdate2001100100000000020020108000000000
fb返回一个所有用户名的纪录集:selectdisti
ctuser
amefromtable2返回结果:user
ame11010099
c返回一个100天记录集和100个用户记录集的笛卡尔集合:selectfromselecttop100dateadddco
verti
tuser
ame1mi
outdateasoutdatefromtable2groupbyuser
ameorderbyco
verti
tuser
ame
asACROSSjoi
selectdisti
ctuser
amefromtable2asBorderbyoutdateco
verti
tuser
ame返回结果100100条纪录:outdate2001100100000000020020108000000000100user
ame1
d返回当前所有用户在数据库的有的纪录:selectoutdateuser
amemi
cashascashfromtable2groupbyoutdateuser
ame
forderbyoutdateco
verti
tuser
ame返回纪录:outdate200110010000000002002010800000000010050user
ame1cash90
e将c中返回的笛卡尔集和d中返回的纪录做leftjoi
selectCoutdateCuser
ameDcashfromselectfromselecttop100dateadddco
verti
tuser
ame1mi
outdateasoutdatefromtable2groupbyuser
ameorderbyco
verti
tuser
ameasACROSSjoi
selectdisti
ctuser
amefromtable2asBasCleftjoi
selectoutdateuser
amemi
cashascashfromtable2groupbyoutdateuser
ameasDo
Cuser
ameDuser
amea
ddatediffdCoutdateDoutdate0
orderbyCoutdateco
verti
tCuser
ame注意:用户在当天如果没有纪录,cash字段返回NULL,否则cash返回每个用户当天的余额outdate20011001000000000user
ame1cash90
f2001100100000000020011002000000000
2
100
1
90
20011002000000000
2
NULL注意这里
20020108000000000
100
50
f好了,现在我们最后要做的就是,如果cash为NULL,我们要返回小于当前纪录日期的第一个用户余额由于我们使用orderbycash所以返回top1纪录即可,使用mi
应该也可以,这个余额即为当前的余额:caseis
ullDcash0whe
0the
selecttop1cashfromtable2wheretable2user
ameCuser
amea
ddatediffdCoutdatetable2outdate0orderbytable2cashelseDcashe
dascash
g最后组合的完整r
好听全球资料 返回顶部