我正在做一个学生出勤项目。我在数据库的表格中记录出勤情况。
我想创建一份每月出勤报告。我找到了一个存储过程来做到这一点。
桌子
CREATE TABLE Attend
(
NAME VARCHAR(50),
DATE DATETIME ,
PRESENT_STATUS VARCHAR(10)
)
存储过程:
CREATE PROCEDURE GET_ATTENDANCEREPORT
@STARTDATE DATETIME,
@ENDDATE DATETIME
AS
BEGIN
WITH DATERANGE AS
(
SELECT DT = DATEADD(DD,0, @STARTDATE)
WHERE DATEADD(DD, 1, @STARTDATE) <= @ENDDATE
UNION ALL
SELECT DATEADD(DD, 1, DT)
FROM DATERANGE
WHERE DATEADD(DD, 1, DT) <= @ENDDATE
)
SELECT *
INTO #TMP_DATES
FROM DATERANGE
DECLARE @COLUMN VARCHAR(MAX)
SELECT @COLUMN = ISNULL(@COLUMN + ',', '') + '[' + CAST(CONVERT(DATE, T.DT) AS VARCHAR) + ']'
FROM #TMP_DATES T
DECLARE @Columns2 VARCHAR(MAX)
SET @Columns2 = SUBSTRING((SELECT DISTINCT ', ISNULL(['+ CAST(CONVERT(DATE, DT) as varchar) + '],''N/A'') AS ['+CAST(CONVERT(DATE , DT) as varchar )+']'
FROM #TMP_DATES
GROUP BY dt
FOR XML PATH('')), 2, 8000)
DECLARE @QUERY VARCHAR(MAX)
SET @QUERY = 'SELECT NAME, ' + @Columns2 +
' FROM (SELECT A.NAME, B.DT AS DATE, A.PRESENT_STATUS FROM Attend A RIGHT OUTER JOIN #TMP_DATES B ON A.DATE = B.DT) X
PIVOT
(MIN([PRESENT_STATUS])
FOR [DATE] IN (' + @COLUMN + ')) P
WHERE ISNULL(NAME,'''')<>''''
'
EXEC (@QUERY)
DROP TABLE #TMP_DATES
END
但是我想在 Crystal Report 中创建报表。
我希望它看起来像这样:
因为当我在 Crystal Report 中使用存储过程时,它不起作用,因为创建列需要我输入开始日期和结束日期,这是一个无法固定的变量。
我想要 Crystal Report 中的报告
创建一个 DAYS 表,其中包含“年”、“月”、“日期”、“DayLetter”列,并为每一天填充一条记录。如果您谷歌主题“日期维度表的脚本”,您应该找到示例。
使用“日期”列对出勤表进行外部联接。
在 Crystal 中,插入交叉表。使用显示字符串表达式来显示所需的数据。