我使用Visual Studio在我们的中心计算了代理状态的报告。在报告中是用于选择报告日期的参数,另一个用于从报告统计中选择要排除的代理。SQL 2014,SSRS - 使用参数计算时间给出错误和错误计算
表中的数据具有登录时间和注销时间。我做了datediff
以秒为单位获得总登录时间。然后我将所有代理人的秒数加起来,以便在当天完成总转移(以秒为单位)。 我创建了一个将秒数转换为hh:mm:ss的函数。
问题:
无论我从下拉列表中选择哪些代理,我的总工作时间段保持不变。
的功能,我创建:
CREATE FUNCTION [dbo].[UDF_SecondsToHHMMSS_VarChar](@Seconds int) RETURNS varchar(20) AS
BEGIN
RETURN (
SELECT CONVERT(VARCHAR(20), @Seconds/3600) + ':'
+ RIGHT('00' + CONVERT(VARCHAR(2), (@Seconds % 3600)/60) ,2) + ':'
+ RIGHT('00' + CONVERT(VARCHAR(2), @Seconds%60), 2) AS [HMS]
)
END
GO
查询作为主数据集的一部分:
,(SELECT [UDF_SecondsToHHMMSS_VarChar](SUM (DATEDIFF(second, AgentLoginTime, AgentLogoutTime)))
FROM [AgentStats]
WHERE DATEADD(dd, 0, DATEDIFF(dd, 0, MidnightStartDate)) = CAST(@S AS DATETIME)
AND (AgentID NOT IN (@AgentName) OR ISNULL(AgentID,'') = '')
)[Actual Shift Hrs]
-- I used a GROUP BY later to calculate the SUM
我创造了另一个数据集拉起代理名称从统计来排除。当没有要排除的代理时,我使用Union
添加虚拟行(我将其设置为默认值)。
的数据集是:
SELECT DISTINCT AgentID, AgentFirstName + ' ' + AgentLastName [AgentName]
FROM AgentStats
WHERE MidnightStartDate >= dateadd(day, -60, getdate())
AND MidnightStartDate < getdate()
AND AgentID NOT IN ('1067', '1050', '1150', '1052', '1161', '1158', '1063', '1173', '1101', '1128', '1165') -- These agents permanently excluded
UNION
SELECT '100', 'No Agents' -- This is default if there are no agents to select from drop-down
ORDER BY [AgentName];
我设置的参数来选择报告的日期,另一个选择代理商从多选排除降下来了。
对于AgentName参数,我选择了相关数据集并选择了AgentID作为Value字段,将AgentName作为Label字段。
我不知道为什么主查询不是从AgentName参数中选择AgentID。
我在做什么错?
编辑1:当一个查询给我下面的结果单独运行
我AGENTNAME数据集。 (见附件中的例子。忽略名人的名字)
我的意图是,主数据集应采取的ID从AGENTID列,以逗号分隔字符串排列并排除那些从合计移动小时。
编辑2:
我想我修好了。我要做一些测试来检查结果。我改变了代码在主数据集:
AND (AgentID NOT IN (@AgentName,'1067', '1050', '1150', '1052', '1161', '1158', '1063', '1173', '1101', '1128', '1165') OR ISNULL(AgentID,'') = '')
你能只是张贴整个查询....这是非常混乱试图拼凑一切一起。 – scsimon
AND(AgentID NOT IN(@AgentName)or ...这部分几乎肯定是错误的,除非@AgentName实际上是AgentID,并且是一个以逗号分隔并带引号的列表,它是传递给这个参数的实际值是什么? – scsimon
他是解析'@ AgentName'的'AgentID'值字段 – LONG