关于SQL 的with as 循环用法

WITH AS短语也叫做子查询部分(subquery factoring),是用来定义一个SQL片断,该SQL片断会被整个SQL语句所用到。这个语句算是公用表表达式(CTE),对于with 的循环 sql 2008有限制,最大只能递归 100 次,下面来测试看看。

如我想生成1到200行的数据

代码:with t as (
select 1 as id 
union all
select t.id+1 from t where t.id<200)
 select * from t   

运行时报错:关于SQL 的with as 循环用法_第1张图片,对于CTE的限制需要利用recursion 函数解除限制,

with t as (
select 1 as id 
union all
select t.id+1 from t where t.id<200)
 select * from t 

option (maxrecursion 0)   这样执行就没有问题,0是代表无限大,也可以改1000,或者2000 指定的数值,前提是要大于你递归的次数,不然还是报错。再来说说利用with 自定义值去循环指定值,下面拿做的一个SSRS 报表进行演示,excel效果图如下,现在要作成SSRS 报表。关于SQL 的with as 循环用法_第2张图片

第一:将出勤人员的姓名与(出勤、上班、下班)做循环,再取出刷卡时间。

with x as  ------------定义循环值
(select * from (values(N'出勤'),
                                      (N'上班'),
                                      (N'下班'))as a (type1)),
    y as (select distinct a.userid,b.name,b.BADGENUMBER
                 from 出勤table a 
                 inner join usertable  b on a.USERID = b.USERID,

z as (select * from x,y)

select * from z   结果

关于SQL 的with as 循环用法_第3张图片

可以看到出勤、上班、下班 三个值已经跟每个user进行了循环,

    第二 :再自定义指定某年的某月存在的日期天数

代码如:date1 as

 (select convert(varchar(10),dateadd(DAY,t2.number,t1.day),120) day from 
(select @date1+'-'+@date2+'-01' day) t1, 
(select number from MASTER..spt_values WHERE TYPE='P' AND number>=0 and number<=31) t2 
 where convert(varchar(10),dateadd(DAY,t2.number,t1.day),120) like @date1+'-'+@date2+'%' 
    )-----------@date1 为指定的年份、@date2 为指定的月份,当然需要在前面定义变量值,这里就省略了,

第三:再将打卡时间进行排名,在http://blog.csdn.net/qyx0714/article/details/72683408 这里介绍按打卡时间排名取打卡数据的介绍,最终整理SSRS 图如下:

关于SQL 的with as 循环用法_第4张图片


你可能感兴趣的:(SSRS,SQL,Server)