Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在dynamic pivot中使用行和列合计排序工作日_Sql Server_Sql Server 2008_Pivot_Crosstab_Dynamic Pivot - Fatal编程技术网

Sql server 如何在dynamic pivot中使用行和列合计排序工作日

Sql server 如何在dynamic pivot中使用行和列合计排序工作日,sql-server,sql-server-2008,pivot,crosstab,dynamic-pivot,Sql Server,Sql Server 2008,Pivot,Crosstab,Dynamic Pivot,我有一个表,其中有一些员工详细信息,如id、employeeid、workdate、taskid、小时数、entrydate、entryby 另一个表包含有关用户的基本信息,如firstname、lastname、emailid、password 现在,我想创建一个交叉表查询,其中显示用户名、工作日以及员工的工作总小时数。 首先,我想用临时表来做这个,但我没能做到,所以我一周中的每一天都用类似的东西 select distinct employeeid ,sum(hours) as TotalH

我有一个表,其中有一些员工详细信息,如id、employeeid、workdate、taskid、小时数、entrydate、entryby

另一个表包含有关用户的基本信息,如firstname、lastname、emailid、password

现在,我想创建一个交叉表查询,其中显示用户名、工作日以及员工的工作总小时数。 首先,我想用临时表来做这个,但我没能做到,所以我一周中的每一天都用类似的东西

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
但对我来说,这是行不通的。任何人请告诉我使用pivot的查询我想要这样的结果

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

这是样品表

还有示例代码

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
现在,我们执行逻辑来计算每个名称和工作日的总计,并在最后一行中显示行总计

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表中选择不同的列

现在,按照RNOin透视查询和订单,我们已经应用逻辑将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
结果如下

这是小提琴 如果在加载时显示任何错误,只需单击RUNSQL按钮,它就会工作

这里有一个更新,我们需要找到给定日期的开始日期和结束日期,在插入临时表之后添加以下内容

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)
并在多维数据集ie之前的WHERE条件中使用上述变量

WHERE [DATE] BETWEEN @STARTDATE AND @ENDDATE

@Azadchouhan use AND DATEPART wk,entrydate=1..具体一周的时间是多少请告诉我这里的结束使用时间是多少?@Azadchouhan如果datename是monday,它将计算小时数,依此类推on@Azadchouhan ,您正在查找整个月的记录sso您将始终保持4-5周的编号。我的一些要求更改请帮助我,如果您对此有任何想法,这是新问题的链接您得到答案了吗@Azad chouhancan u请告诉我,如果任何用户输入搜索数据的任何日期,我如何获取所有周日。例如,如果任何用户输入2014年12月10日,那么我必须使用该日期查找一周的开始日期和结束日期。我已添加了您的更新。检查@Azad Chouhan时请告诉我发生了什么?上述查询是否不符合您的规范,或者您的实际规范是什么?下面的查询已经为您的带有图像的问题生成了结果。发生了什么事?这不是正确的答案吗@阿扎德周汉
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 [DATE] BETWEEN @STARTDATE AND @ENDDATE