视图
SELECT DISTINCT Proson.emp_id, Proson.emp_fname, Proson.depart_id, B_1.Holiday, CASE WHEN LEFT(CONVERT(VARCHAR(100), C.sign_time, 23), 10) IS NULL THEN '休' ELSE '' END AS 打卡日期 FROM ( -- 查询员工信息 SELECT emp_id, emp_fname, depart_id FROM dbo.Employee AS B WHERE (kind = '0') AND (depart_id LIKE '00109%') AND (native_id IS NULL) ) AS Proson CROSS JOIN ( SELECT Holiday FROM ( SELECT DISTINCT LEFT(CONVERT(VARCHAR(100), sign_time, 23), 10) AS Holiday FROM dbo.timeRecords --美国默认周日为第一天 WHERE (DATEPART(WEEKDAY, sign_time) = '7') AND (sign_time > '2020-04-16') UNION SELECT holiday FROM dbo.XinxihuaHoliday) AS A ) AS B_1 LEFT OUTER JOIN dbo.timeRecords AS C ON C.emp_id = Proson.emp_id AND LEFT(CONVERT(VARCHAR(100), C.sign_time, 23), 10) = B_1.Holiday
行转列 存储过
`DECLARE @sql_col NVARCHAR(MAX)
DECLARE @sql_where NVARCHAR(MAX)
DECLARE @tableName SYSNAME --行转列表
DECLARE @groupColumn SYSNAME --分组字段
DECLARE @row2column SYSNAME --行变列的字段
DECLARE @row2columnValue SYSNAME --行变列值的字段
SET @tableName = 'View_UserVacation'
SET @groupColumn = 'emp_id],[emp_fname],[depart_id'
SET @row2column = 'Holiday'
SET @row2columnValue = '打卡日期'
SET @sql_where = 'WHERE 1=1'
--从行数据中获取可能存在的列
SET @sql_str = N'
SELECT @sql_col_out = ISNULL(@sql_col_out + '','','''') + QUOTENAME(['+@row2column+']) FROM ['+@tableName+'] '+@sql_where+' GROUP BY ['+@row2column+']'
--PRINT @sql_str
EXEC sp_executesql @sql_str,N'@sql_col_out NVARCHAR(MAX) OUTPUT',@sql_col_out=@sql_col OUTPUT
--PRINT @sql_colSET @sql_str = N'
SELECT * FROM (SELECT ['+@groupColumn+'],['+@row2column+'],['+@row2columnValue+'] FROM ['+@tableName+']'+@sql_where+') p PIVOT (MAX(['+@row2columnValue+']) FOR ['+@row2column+'] IN ( '+ @sql_col +') ) AS pvt
ORDER BY pvt.['+@groupColumn+']'
--PRINT (@sql_str)
EXEC (@sql_str)
END
`