我正在尝试获取特定日期的活动代码,以显示特定工作人员一年中每个月的31天。
如果工作人员在场,生病,放假等......我希望这些活动代码根据下面的输出显示一年的act_date范围。
谢谢!
答案 0 :(得分:0)
首先,创建一个函数,该函数将给出特定范围的日期值
CREATE FUNCTION [dbo].[GetAllDatesBetweenRange]
(
@FromDate DATE
,@ToDate DATE
)
RETURNS @Dates TABLE
(
DateVal DATE
)
AS
BEGIN
;WITH CTE
AS
(
SELECT @FromDate AS FromDate
UNION ALL
SELECT DATEADD(DD,1,FromDate)
FROM CTE
WHERE FromDate < @ToDate
)
INSERT INTO @Dates
SELECT FromDate FROM CTE
OPTION (MAXRECURSION 0)
RETURN;
END
GO
使用以下动态查询来旋转特定日期范围
DECLARE @Sql NVARCHAR(MAX);
DECLARE @DateVal NVARCHAR(MAX);
SELECT @DateVal = STUFF((SELECT ',['+CAST(DateVal AS NVARCHAR(50))+']'
FROM [dbo].[GetAllDatesBetweenRange]('2017-01-01','2017-12-31')
FOR XML PATH('')),1,1,'')
SET @Sql = '
;WITH CTE
AS
(
SELECT Res1.STAFF_ID
,Res2.DateVal
,Res1.ACTIVITY_CODE
FROM [dbo].[GetAllDatesBetweenRange](''''2017-01-01'''',''''2017-12-31'''') Res1
LEFT JOIN TableA A ON A.ACT_DATE = Res1.DateVal
)
SELECT STAFF_ID
,*
FROM CTE
PIVOT
(
MAX(ACTIVITY_CODE)
FOR DateVal IN ('+@DateVal+')'+'
)'
EXEC SP_EXECUTESQL @Sql
答案 1 :(得分:0)
这可以通过旋转来实现。您可以在此处输入查询中的员工ID,以获取特定员工的结果。
--create table
create table staff_info
(
staffId int,
actDate datetime,
activityCode int
)
--insert values
insert into staff_info values
(2699, '01/02/2017', 101),
(2699, '05/14/2017', 303),
(2699, '08/06/2017', 101),
(1927, '10/25/2017', 105)
--actual solution
select * from
(
select staffId, day(actDate) as act_day,month(actDate) as actual_month,
activityCode
from staff_info
where staffId=2699 ----- enter the staff id here
) src
pivot
(
sum(activityCode)
for act_day in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],
[14],[15],
[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],
[31]
)
) p
<强>结果:强>