2017-06-15 120 views
-1

我从具有25列标题的百万行表中提取数据。我有一个简单的查询,可以根据日期提取总的应答呼叫和总连接秒数。SQL Server - 根据前300行(和301+)总结列

SELECT 
convert(date,format(Dateadd(hh,1,[Start Time]),'dd/MM/yyyy'),103) as [Date] 
,sum(iif([type] = 'normal operator call',1,0)) as [answered calls] 
,sum([connected (secs)]) as [total con sec] 


from inboundcallsview 

where [account] = '106844' 

and dateadd(hh,1,[start time]) between '2017-05-01' and '2017-06-01' 

group by convert(date,format(Dateadd(hh,1,[Start Time]),'dd/MM/yyyy'),103) 

我所希望做的是和第一个300的连接秒(按[开始时间]列)接听的电话(任一行其中[类型] =“普通话务员呼叫”)的各日(由[日期]栏定义)。以及从301开始的所有呼叫的总连接秒数。基本上我的电流输出为

current

,我想它是

desired output

忽略日期的变化六月(06)应可(05)我搞砸了创建我例。我最终会想要在所有日期这样做,所以日期参数并不重要。

在此先感谢。

+0

你知道ROW_NUMBER函数? –

+0

我知道它存在,但不知道如何将它合并,当我已经分裂和按日期分组,并且每个日期的行数将是随机的。这就是我想要的帮助。有没有办法让每个日期都是自己的子表,并计算该子表的行数?那将是什么样子? – tomdemaine

+0

用'OVER(PARTITION BY(你的日期输出)ORDER BY [开始时间])研究'ROW_NUMBER''顺便说一句,你将不得不UNION两个派生表。一桌1-300,另一桌301+ –

回答

1

在伪代码,它看起来就像这样:

WITH CTE AS (
    SELECT {Your Date Output} AS [date], 
     ,[ConnectedSecs] 
     ROW_NUMBER() OVER (PARTITION BY {Your Date Output}, ORDER BY [Start Time]) AS rn 
    FROM YourTable 
    WHERE {Conditions} 
) 
SELECT 
    [date], 
    'First 300' AS Bracket, 
    SUM(ConnectedSecs) 
    FROM CTE WHERE rn < 301 
    GROUP BY [date] 
UNION ALL SELECT 
    [date], 
    '301+' AS Bracket, 
    SUM(ConnectedSecs) 
    FROM CTE WHERE rn >= 301 
    GROUP BY [date] 
ORDER BY [date],{a case expression to have 'First 300' on top if desired} 
+0

这是非常有用的,谢谢! – tomdemaine