Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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
SQLI如何修改此查询以按小时选择唯一_Sql_Sql Server - Fatal编程技术网

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;