枢轴活动代码天数

时间:2017-11-02 14:23:29

标签: sql-server sql-server-2008

我正在尝试获取特定日期的活动代码,以显示特定工作人员一年中每个月的31天。

如果工作人员在场,生病,放假等......我希望这些活动代码根据下面的输出显示一年的act_date范围。

谢谢!

enter image description here Pivot Activity Code Days Months

2 个答案:

答案 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

<强>结果:

HTDELETE

enter image description here