公司的请休假,出差表上只记录了开始时间和结束时间,万恶的人事要做一个报表,要把员工的情况显示出来如图一所示,想了好多百度了好多,总算把sql整出来了
图一:
sql:
with cte as (select formmain_4740.id id, formmain_4740.finishedflag finishedflag, formmain_4740.ratifyflag ratifyflag , 枚举值表1.MJNAME MJNAME, ORG_MEMBER.mname mname, org_unit.name name, formmain_4740.field0009 field0009, formmain_4740.field0010 field0010, formmain_4740.field0011 field0011, formmain_4740.field0012 field0012, formmain_4740.field0025 field0025, formmain_4740.field0027 field0027, formson_4787.field0020 field0020, formson_4787.field0023 field0023, formson_4787.field0021 dday, formson_4787.field0022 EndDate from formson_4787 left join formmain_4740 on formson_4787.formmain_id=formmain_4740.id left join (select id AS MID, name AS MNAME from ORG_MEMBER) org_member on formmain_4740.field0004 = ORG_MEMBER.Mid left join (SELECT ID AS MJID, 枚举名称 as mjname from 枚举值表) 枚举值表1 ON formson_4787.field0020 = 枚举值表1.MJID left join org_unit on formmain_4740.field0005=org_unit.id where ratifyflag = 1 and Datename(year,formson_4787.field0021)='2018' and org_unit.name='部门' union all select id, finishedflag, ratifyflag , MJNAME, mname, name, field0009, field0010, field0011, field0012, field0025, field0027, field0020, field0023, dday+1,EndDate from cte where convert(nvarchar(10),dday,120) < convert(nvarchar(10),EndDate,120)) select * from cte order by mname,dday
简单的可以理解为:
with test as ( select field0021 dday, field0022 EndDate from formson_1234 union all select dday+1, EndDate from test where convert(nvarchar(10),dday,120) < convert(nvarchar(10),EndDate,120)) ) select * from test