我有一个attendance
表,其中包含学生的出勤日期和出席状态。SQL Server查询显示特定月份或日期之间的汇总列表
有没有什么办法来显示摘要是这样的:
Student 20-09-2012 21-09-2012 22-09-2012 23-09-2012
xyz P A P P
abc P P P P
通过SQL Server查询?
我试过用PIVOT
,但它不起作用,因为聚合函数。
我有一个attendance
表,其中包含学生的出勤日期和出席状态。SQL Server查询显示特定月份或日期之间的汇总列表
有没有什么办法来显示摘要是这样的:
Student 20-09-2012 21-09-2012 22-09-2012 23-09-2012
xyz P A P P
abc P P P P
通过SQL Server查询?
我试过用PIVOT
,但它不起作用,因为聚合函数。
我试过用PIVOT,但它不起作用,因为聚合 函数。
可以使用MAX
作为聚合函数,像这样:
SELECT t.StudentName,
MAX(CASE WHEN t.Date = '20120920' THEN t.Status END) AS '20-09-2012',
MAX(CASE WHEN t.Date = '20120921' THEN t.Status END) AS '21-09-2012',
MAX(CASE WHEN t.Date = '20120922' THEN t.Status END) AS '22-09-2012',
MAX(CASE WHEN t.Date = '20120923' THEN t.Status END) AS '23-09-2012'
FROM Attendence t
GROUP BY t.StudentName
你的问题让我想起了一个相似的,我不得不解决的。使用动态SQL您的问题解决了如下
-- create list of all dates
DECLARE @dates varchar(1000) = ''
SELECT @dates = @dates + ',[' + CAST(t.[date] as varchar)+']'
FROM (SELECT DISTINCT [date] FROM Attendance) t
-- remove first comma
IF LEN(@dates)>1 SET @dates = RIGHT(@dates,LEN(@dates)-1)
-- create query with UNPIVOT and PIVOT
exec('SELECT
StudentName,'+
@dates+
'FROM(
SELECT
[date],
[stat],
StudentName
FROM
(SELECT
[date],
[status],
StudentName
FROM
Attendance
) AS t
UNPIVOT
(stat FOR s in ([status])) unpvt
) dummy
PIVOT
(
MAX(stat) FOR [date] in ('[email protected]+')
) pvt
ORDER BY StudentName;');
也就是说SqlFiddle您的要求
DECLARE @DynamicPivotQuery AS NVARCHAR(max)
DECLARE @ColumnName AS NVARCHAR(max)
SELECT a.grno,
a.a_date [Date],
a.status,
s.first_name,
s.last_name
INTO #pivotdata
FROM attendance_master AS a,
student_master AS s
WHERE sid = " & dd_sub.selecteditem.value & "
AND s.grno = a.grno
AND a.a_date >= '" & txtdate1.Text & "'
AND a.a_date <= '" & txtdate2.Text & "'
GROUP BY a.grno,
a.status,
a.a_date,
s.last_name,
s.first_name
SELECT @ColumnName = Isnull(@ColumnName + ',', '')
+ Quotename([date])
FROM (SELECT DISTINCT [date]
FROM #pivotdata) AS Dates
SET @DynamicPivotQuery = 'SELECT grno,first_name,last_name,'
+ @ColumnName
+ 'FROM #PivotData PIVOT(sum(status) FOR [Date] IN ('
+ @ColumnName + ')) AS PVTTable1'
EXEC Sp_executesql
@DynamicPivotQuery
喜马哈茂德·贾迈勒,感谢乌拉圭回合的解决方案,但我的问题是出勤日期没有预先定义它应该从日期和时间等参数生成日期 – user1645200
@ user1645200请问您可以添加您的表格的结构请 –
Mahmoud Gamal,Max功能在Pivot查询和工作正常再次感谢您的解决方案 – user1645200