Sql server 按存储过程存储另一列中的行总和
我得到了所有员工的工作时间清单。查询如下:Sql server 按存储过程存储另一列中的行总和,sql-server,sql-server-2008,stored-procedures,pivot-table,Sql Server,Sql Server 2008,Stored Procedures,Pivot Table,我得到了所有员工的工作时间清单。查询如下: ALTER PROCEDURE [dbo].[Get_EmployeeWiseWorkingTime] @PayPeriodID as int AS BEGIN DECLARE @StartDate DATETIME='2014-04-21 00:00:00.000' DECLARE @EndDate DATETIME='2014-05-04 00:00:00.000' Select @StartDate=[PeriodStartDate],@End
ALTER PROCEDURE [dbo].[Get_EmployeeWiseWorkingTime]
@PayPeriodID as int
AS
BEGIN
DECLARE @StartDate DATETIME='2014-04-21 00:00:00.000'
DECLARE @EndDate DATETIME='2014-05-04 00:00:00.000'
Select @StartDate=[PeriodStartDate],@EndDate=[PeriodEndDate] from PayPeriod --where PayPeriodId=@PayPeriodID
DECLARE @DateList VARCHAR(MAX), @DateListCoalesced VARCHAR(MAX)
SELECT @DateList = '', @DateListCoalesced = ''
;WITH DateLimits AS (
SELECT CAST(@StartDate AS DATE) AS dt
UNION ALL
SELECT DATEADD(dd, 1, dt)
FROM DateLimits s
WHERE DATEADD(dd, 1, dt) <= CAST(@EndDate AS DATE))
SELECT @DateList = @DateList + '[' + CAST(dt AS VARCHAR)+ '], ' ,
@DateListCoalesced = @DateListCoalesced + ' COALESCE( [' + CAST(dt AS VARCHAR)+ '] , 0) as [' + CAST(dt AS VARCHAR)+ '], '
FROM DateLimits
;SET @DateList = LEFT(@DateList, LEN(@DateList) - 1)
;SET @DateListCoalesced = LEFT(@DateListCoalesced, LEN(@DateListCoalesced) - 1)
DECLARE @query NVARCHAR(max)
SET @query = N'SELECT [EmployeeID],FirstName,LastName, ' + @DateListCoalesced +'
FROM
(SELECT DayLog.[EmployeeID],FirstName,LastName, DayLog.[CreatedDate], [WorkingTime]
FROM DayLog
INNER JOIN Employees ON Employees.EmployeeID = DayLog.EmployeeID
) p
PIVOT
(
Sum ([WorkingTime] )
FOR [CreatedDate] IN ( '+ @DateList +' )
) AS pvt order by EmployeeID'
EXEC sp_executesql@Query
结束
结果是:
我想添加一个列名Total,用于计算并添加所列数据的总工作时间。
任何示例都将不胜感激。“从字符串转换日期和/或时间时转换失败。”请将DayLog。[CreatedDate]更改为Convertvarchar50,DayLog。[CreatedDate],120。使用任何格式,而不是你期望的120格式。这是相同的结果。。我将结果添加为图像。。未添加任何名为“Total”的列您还必须将“Total”列添加到“selected”列表中。它工作正常。。只有一件事。。。我根据从下拉列表中选择的@PayperiodId填充数据。total字段为我提供了该特定员工的所有金额,而不考虑所选的发薪期
;SET @DateList = @DateList + 'Total'
;SET @DateListCoalesced = @DateListCoalesced + 'Total'
SET @query = N'SELECT [EmployeeID],FirstName,LastName, ' + @DateListCoalesced +'
FROM
(
SELECT DayLog.[EmployeeID],FirstName,LastName, Convert(varchar(50), DayLog.[CreatedDate], 120) as CreatedDate, [WorkingTime]
FROM DayLog
INNER JOIN Employees ON Employees.EmployeeID = DayLog.EmployeeID
UNION
SELECT DayLog.[EmployeeID],FirstName,LastName, ''Total'', Sum([WorkingTime])
FROM DayLog
INNER JOIN Employees ON Employees.EmployeeID = DayLog.EmployeeID
GROUP BY DayLog.[EmployeeID],FirstName,LastName
) p
PIVOT
(
Sum ([WorkingTime] )
FOR [CreatedDate] IN ( '+ @DateList +' )
) AS pvt order by EmployeeID'