SQLI如何修改此查询以按小时选择唯一
(寻找更好的标题) 你好,我有下面的问题SQLI如何修改此查询以按小时选择唯一,sql,sql-server,Sql,Sql Server,(寻找更好的标题) 你好,我有下面的问题 Declare @CDT varchar(23) Declare @CDT2 varchar(23) set @cdt = '2016-01-18 00:00:00.000' set @cdt2 = '2016-01-26 00:00:00.000' SELECT spt.number AS [Hour of Day], (SELECT COUNT(DISTINCT AgentId) FROM history t2
Declare @CDT varchar(23)
Declare @CDT2 varchar(23)
set @cdt = '2016-01-18 00:00:00.000'
set @cdt2 = '2016-01-26 00:00:00.000'
SELECT
spt.number AS [Hour of Day],
(SELECT COUNT(DISTINCT AgentId)
FROM history t2
WHERE DATEPART(HOUR, t2.calldatetime)=spt.number
AND projectid IN (5) and calldatetime between @cdt and @cdt2) AS [Project 5 ],
(SELECT COUNT(DISTINCT AgentId)
FROM history t2
WHERE DATEPART(HOUR, t2.calldatetime)=spt.number
AND projectid IN (124) and calldatetime between @cdt and @cdt2) AS [Project 124],
(SELECT COUNT(DISTINCT AgentId)
FROM history t2
WHERE DATEPART(HOUR, t2.calldatetime)=spt.number
AND projectid IN (576) and calldatetime between @cdt and @cdt2) AS [Project 576]
FROM master..spt_values spt
WHERE spt.number BETWEEN 0 AND 11 AND spt.type = 'p'
GROUP BY spt.number
ORDER BY spt.number
我现在需要选择一个每小时唯一的数字,而不是一个独特的总数量
例如,如果我使用“selectdistinct(Agentid),其余的查询在这里运行,它将给我一个Agentid计数,与案例无关,我如何“当Agentid是唯一的”呢
我从原始问题中复制了一些例子
Project id Datetime Agentid
---------- ----------------------- ---------
5 11-23-2015 09:00:00.000 12
5 11-23-2015 10:00:00.000 12
6 11-23-2015 11:00:00.000 12
1 11-23-2015 12:00:00.000 3
3 11-23-2015 13:00:00.000 4
124 11-23-2015 14:00:00.000 7
124 11-23-2015 15:00:00.000 9
124 11-23-2015 16:00:00.000 10
576 11-23-2015 17:00:00.000 10
576 11-23-2015 18:00:00.000 44
576 11-23-2015 19:00:00.000 69
etc 11-23-2015 20:00:00.000 23
预期输出(忽略不正确的计数,假设它们在上面是正确的^):
到目前为止
Hour of Day Project 5 Project 124 Project 576
0 0 0 0
1 0 0 0
2 0 0 0
3 0 0 0
4 0 0 0
5 0 0 0
6 0 0 0
7 0 0 0
8 0 0 0
9 0 0 0
10 0 0 0
11 0 0 0
我非常确定,您需要使用子查询来执行此操作:
SELECT
spt.number AS [Hour of Day],
(SELECT COUNT(DISTINCT AgentId)
FROM YourTable t2
WHERE DATEPART(HOUR, t2.yourdatetime)=spt.number
AND projectId IN (5)) AS [Project 5 ],
(SELECT COUNT(DISTINCT AgentId)
FROM YourTable t2
WHERE DATEPART(HOUR, t2.yourdatetime)=spt.number
AND projectId IN (124)) AS [Project 124],
(SELECT COUNT(DISTINCT AgentId)
FROM YourTable t2
WHERE DATEPART(HOUR, t2.yourdatetime)=spt.number
AND projectId IN (576)) AS [Project 576]
FROM master..spt_values spt
WHERE spt.number BETWEEN 0 AND 11 AND spt.type = 'p'
GROUP BY spt.number
ORDER BY spt.number
以下是这些查询使用的表:
DECLARE @wt TABLE (
projectid varchar(4) not null,
edate datetime not null,
agentid int not null );
如果要按时间和项目获取计数,请使用以下查询:
SELECT edate, projectid, COUNT(*) as nentries
FROM @wt
GROUP BY edate, projectid;
我还没有处理过按小时计算日期的问题,这是另一个问题。
要获得如图所示的表格结果集,请执行以下操作:
SELECT edate, [5] AS [Project 5], [124] AS [Project 124], [576] AS [Project 576]
FROM (
SELECT edate, CAST(projectid AS int) AS projectid
FROM @wt
WHERE ISNUMERIC(projectid) <> 0 ) AS s
PIVOT (
COUNT(projectid)
FOR projectid IN ([5], [124], [576])) AS p;
选择edate[5]作为[项目5],[124]作为[项目124],[576]作为[项目576]
从(
选择edate,强制转换(projectid为int)为projectid
来自@wt
其中ISNUMERIC(projectd)0)作为s
支点(
计数(投影)
对于([5]、[124]、[576])中作为p的投影;
以下是使用上述数据的PIVOT查询的结果集:
但是,您必须在查询中指定感兴趣的项目。如果您想要拥有任意数量的项目并为每个项目获取列,则需要动态SQL来构造透视查询
@Tab Alleman:我添加了一些数据来说明测试场景的条件。以下是相同PIVOT查询的结果集:
左连接时,将右侧表条件放入ON子句中,以获得真正的左连接结果。(在WHERE子句中,它作为常规内部连接执行。)@jarlh?好的Tab,换一下now@ConradFrix也许是我所做的更新,使这些ClearHello选项卡成为Allerman,本质上我正在寻找一个修改,它只会选择每“小时”的唯一AgentID的数量“想象一下在一个小时内有300条记录,这很好,但现在我需要知道在那个小时有多少代理处于活动状态。Msg 4104,16级,状态1,第1行多部分标识符“master..spt_values.number”无法绑定。有什么想法吗?请注意,我已经给表添加了别名,因此如果您也这样做了,那么您需要在查询中引用它的任何地方使用别名而不是表名。我看到我在第一列中遗漏了,现在将修复。现在是最后一部分,我如何告诉它一个特定的日期,通常我会使用和yourdatetime在'11-23-2015 00:00:00.000'和'11-24-2015 00:00:00.000'之间,但这是错误的。您需要设置该条件(
和yourdatetime介于'11-23-2015 00:00:00.000'和'11-24-2015 00:00:00.000'之间
)在每个子查询的where
子句中。好吧,我很接近,我每天有几个小时的时间,几乎完成了一个查询,但现在我所做的是空白。但是这种方法可以修改为在每个项目/小时桶中计算不同的agentID吗?阅读OP在撰写本文时的最后一条评论。开始“Hello Tab Allerman…”的那条评论)。请参阅最近的编辑以回答。查询无需修改即可完成此操作。它如何计算不同的AgentId而不在查询中的任何位置提及AgentId?对于edate=18:00,子查询将给出两行s
,其中projectid
=576。PIVOT汇总对这些行进行计数。如果同一个agentid
可以多次在同一个projectid
上执行同一个edate
,那么识别和解决该情况将更加复杂。这就是OP的最后一条评论所说的,同一个AgentId可能在同一小时内多次出现在同一项目上,并且他只需要在每个项目/小时范围内对每个唯一的AgentId计数一次。
SELECT edate, [5] AS [Project 5], [124] AS [Project 124], [576] AS [Project 576]
FROM (
SELECT edate, CAST(projectid AS int) AS projectid
FROM @wt
WHERE ISNUMERIC(projectid) <> 0 ) AS s
PIVOT (
COUNT(projectid)
FOR projectid IN ([5], [124], [576])) AS p;