【发布时间】:2018-01-13 04:46:22
【问题描述】:
有 3 张桌子 -
Attendance (EnrollmentNo,SubjectCode,Date,Attendance)
Student (EnrollmentNo, RollNo),
UserDetails(EnrollmentNo,FirstName,LastName).
现在我想要的是按月显示出勤率,以 Roll No、Name、dates 作为列,Student.RollNo、UserDetails.FirstName、UserDetails.LastName、Attendance.Attendance 作为列的数据。
但我面临的问题是如何动态生成日期列并将考勤数据放在相应的日期列中。
Input - Startdate and Enddate
Expected Output -
-------------------------------------------------------
| Roll No | Name | 01-09-2018 | 01-12-2018|
-------------------------------------------------------
| 15 | Suyash Gupta | 1 | 0 |
-------------------------------------------------------
| 24 | Himanshu Shukla | 2 | 2 |
-------------------------------------------------------
| 32 | Dhruv Raj Sirohi | 1 | 1 |
-------------------------------------------------------
这是我的方法 -
DECLARE @startdate date
DECLARE @enddate date
SET @startdate = convert(date,'01-09-2018')
SET @enddate = convert(date,'01-12-2018')
;with cte (@startdate, @enddate) as /*I don't know how to pass my date range
in cte() as this takes table column*/
(
select 1
union all
select dateadd(dd, 1, startdate)
from cte
where startdate <= enddate
)
select c.startdate
into #tempDates
from cte c
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(CHAR(10),
startdate, 120))
from #tempDates
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT RollNo,FirstName,LastName, ' + @cols + ' from
(
select S.RollNo,U.FirstName,U.LastName,
D.startdate,
convert(CHAR(10), startdate, 120) PivotDate
from #tempDates D
left join Attendance A
on D.startdate = A.Date
) x
pivot
(
count(startdate)
for PivotDate in (' + @cols + ')
) p '
execute(@query)
【问题讨论】:
-
您能否展示当前的标记和代码以尝试满足您的要求?在这里,您应该先尝试一下,然后再询问当前设置出了什么问题。
-
没错!展示您已经尝试过的内容以及失败的地方。
-
我已经在上面添加了我的方法。
标签: sql asp.net sql-server sql-server-2014 dynamic-sql