这是示例表

和示例代码
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