SQL我如何修改此查询以按小时选择唯一

时间:2016-01-26 15:36:07

标签: 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
     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

我现在需要每小时选择一个唯一的数字,而不是整体上的明显数量。

例如,如果我用"选择distinct(Agentid),其余的查询来运行它,它会给我一个grantids计数,独立的情况,我如何" WHEN 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

预期输出(忽略不正确的计数,假设它们在上面是正确的^):

Datetime       5    124  576
-------------  ---  ---  ---
09:00 - 09:59  0    4    5
10:00 - 10:59  4    3    1
11:00 - 11:59  5    2    1
12:00 - 12:59  1    1    1
13:00 - 13:59  6    1    1
14:00 - 14:59  6    1    1
15:00 - 15:59  7    1    2
16:00 - 16:59  8    1    3
17:00 - 17:59  9    1    3
18:00 - 18:59  1    1    2
19:00 - 19:59  12   1    0
20:00 - 20:59  0    0    0

到目前为止

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

2 个答案:

答案 0 :(得分:1)

我很确定你需要使用子查询来执行此操作:

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

答案 1 :(得分:1)

以下是这些查询使用的表格:

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;

以下是使用上述数据的PIVOT查询的结果集: PIVOT result set

但是,您必须在查询中指定感兴趣的项目。如果你想拥有任意数量的项目并为每个项目获取列,那么就需要动态SQL来构造PIVOT查询。

@Tab Alleman:我添加了一些数据来说明测试场景的条件。以下是具有相同PIVOT查询的结果集:

Enhanced result set