-1

我有一张表,其中有一些员工详细信息,例如 id、employeeid、workdate、taskid、hours、entrydate、entryby

另一个表有关于用户的基本信息,如名字、姓氏、电子邮件ID、密码

现在我想创建一个交叉表查询,我想在其中显示用户名和工作日以及员工的工作总小时数。好吧,首先我想为此使用临时表,但我没有这样做,所以我在一周中的每一天都使用这样的东西

select distinct employeeid ,sum(hours) as TotalHours ,'MONDAY' as Day into #Monday from Project_TimeSheet where  year(entrydate)='2014' and month(entrydate)='12' and datename(dw,entrydate)='MONDAY' group by employeeid

但对我来说,这是行不通的。任何人请告诉我使用枢轴的查询我想要这样的结果在此处输入图像描述

4

3 回答 3

1
SELECT employeeid,
SUM(CASE WHEN datename(dw,entrydate)='MONDAY' THEN hours END) as Monday,
SUM(CASE WHEN datename(dw,entrydate)='TUESDAY' THEN hours END) as Tuesday,
.....,
sum(hours) as TotalHours
FROM Project_TimeSheet
WHERE  year(entrydate)='2014' and month(entrydate)='12'
GROUP BY employeeid
WITH ROLLUP
于 2014-12-08T12:36:54.353 回答
1

这是示例表

在此处输入图像描述

和示例代码

CREATE TABLE #TEMP (Name varchar(10), [DATE] datetime,
            TotalHours int)
INSERT #TEMP VALUES 
('A','01/JAN/2014',10), 
('B','02/JAN/2014',20), 
('A','03/JAN/2014',20), 
('B','04/JAN/2014',30), 
('A','05/JAN/2014',40), 
('B','06/JAN/2014',50), 
('A','07/JAN/2014',60),
('A','08/JAN/2014',65),
('Z','07/JAN/2014',72),
('B','15/FEB/2014',70),
('B','16/FEB/2014',50), 
('A','17/FEB/2014',60),
('B','18/FEB/2014',70)

在 Sql Server 中将星期一设置为一周的第一天

SET DATEFIRST 1;

将数据插入新表以对工作日进行排序并将总计作为最后一列

SELECT DISTINCT DATENAME(WEEKDAY,[DATE])WK
,DATEPART(DW,[DATE]) WDNO
INTO #ORDERTABLE
FROM #TEMP
UNION ALL
SELECT 'TOTAL HOURS',8
ORDER BY 2,1

现在我们执行计算每个 Name 和 Weekdays 总数的逻辑,并将 row-Total 放在最后一行。

SELECT 
CASE Name WHEN 'TOTAL BY DAY' THEN 0
          ELSE DENSE_RANK() OVER(ORDER BY NAME DESC)
          END RNO,* 
INTO #NEWTABLE
FROM
(
    SELECT CASE WHEN Name IS NULL THEN 'TOTAL BY DAY' ELSE Name END Name,
    CASE WHEN DATENAME(WEEKDAY,[DATE]) IS NULL THEN 'TOTAL HOURS' ELSE DATENAME(WEEKDAY,[DATE]) END WK,
    SUM(TotalHours)TotalHours   
    FROM #TEMP
    WHERE YEAR([DATE])=2014 AND DATENAME(MONTH,[DATE])='JANUARY'
    GROUP BY Name,DATENAME(WEEKDAY,[DATE])
    WITH CUBE
)TAB
ORDER BY RNO DESC

#ORDERTABLE从表中选择不同的列

DECLARE @cols NVARCHAR (MAX)

SELECT @cols = COALESCE (@cols + ',[' + WK + ']', 
               '[' + WK + ']')
               FROM    (SELECT DISTINCT WK,WDNO FROM #ORDERTABLE) PV  
               ORDER BY WDNO

现在旋转查询并按顺序排列RNO(我们已应用逻辑将 Total 放在最后一行)

DECLARE @query NVARCHAR(MAX)
SET @query = '           
              SELECT NAME,' + @cols + ' FROM 
             (
                 SELECT * FROM #NEWTABLE
             ) x
             PIVOT 
             (
                 SUM(TotalHours)
                 FOR WK IN (' + @cols + ')
            ) p       
            ORDER BY RNO DESC
            ' 

EXEC SP_EXECUTESQL @query

这是结果

在此处输入图像描述

这是 SQLFIDDLE http://sqlfiddle.com/#!3/655df/6 (如果加载时显示任何错误,只需单击 RUNSQL 按钮,它将起作用)

这是一个更新,我们需要找到给定日期的那一周的开始日期和结束日期(在插入 #TEMP 表之后添加以下内容)

DECLARE @STARTDATE DATE;
DECLARE @ENDDATE DATE;

SELECT 
@STARTDATE = CASE WHEN DATENAME(WEEKDAY,[DATE])='MONDAY' THEN [DATE]
      WHEN DATENAME(WEEKDAY,[DATE])='SUNDAY' THEN DATEADD(DAY,-6,[DATE]) 
      ELSE DATEADD(DAY,-datepart(dw,[DATE])+1,[DATE]) END 
,@ENDDATE = CASE WHEN DATENAME(WEEKDAY,[DATE])='MONDAY' THEN DATEADD(DAY,6,[DATE])
      WHEN DATENAME(WEEKDAY,[DATE])='SUNDAY' THEN [DATE]
      ELSE DATEADD(DAY,-datepart(dw,[DATE])+7,[DATE]) END 
FROM #TEMP
WHERE [DATE]=CAST('2014-01-06' AS DATE)

并在条件中使用上述变量WHERE(在多维数据集之前),即,

WHERE [DATE] BETWEEN @STARTDATE AND @ENDDATE
于 2014-12-09T04:02:54.943 回答
0

试试看,

    Declare @Year varchar(4)=2014
    Declare @Month varchar(2)=12
    Declare @Input datetime=@Year+'/'+@Month+'/'+'01'
    select @input


    select  employeeid 
    ,(Select sum(hours) as TotalHours from Project_TimeSheet M where year(entrydate)='2014' 
    and month(entrydate)='12' and datename(dw,entrydate)='MONDAY'  and m.employeeid=pts.employeeid  )'MONDAY' 
    from Project_TimeSheet PTS 
    ,(Select sum(hours) as TotalHours from Project_TimeSheet M where year(entrydate)='2014' 
    and month(entrydate)='12' and datename(dw,entrydate)='TUESDAY'  and m.employeeid=pts.employeeid  )'TUESDAY' 
    .....,
    from Project_TimeSheet PTS  
    where  year(entrydate)='2014' and month(entrydate)='12' and datename(dw,entrydate)='MONDAY' 
    group by employeeid

OR 

select 
SUM(MONDAY)MONDAY,SUM(TUESDAY)TUESDAY
,........
sum(hours)TotalHours
from 
(select  employeeid 
,case WHEN datename(dw,entrydate)='MONDAY' THEN hours else 0 end 'MONDAY'
,case WHEN datename(dw,entrydate)='TUESDAY' THEN hours else 0 end 'TUESDAY'
,.....
,hours
from Project_TimeSheet PTS  
where  year(entrydate)='2014' and month(entrydate)='12' and datename(dw,entrydate)='MONDAY' 
)tbl
group by employeeid
于 2014-12-08T12:59:12.277 回答