2011-08-31 102 views
2

我有一个名为Call_Data表和数据的样子:获取时间间隔的计数

Arr_Date  Interval AN_Time AB_Time 
08/08/2011 1600  113  NULL 
08/08/2011 1400  317  NULL 
08/09/2011 1200  298  NULL 
08/09/2011 1000  NULL  194 
08/10/2011 1200  256  NULL 
08/10/2011 1400  NULL  132 

我期待得到这样的输出:

Arr_Date Total_calls AN_10_min AN_5_min AB_10_Min  AB_5_min 
08/08/2011 2    2   1    0   0 
08/09/2011 2    1   1    1   1 
08/10/2011 2    1   1    1   1 

逻辑是列AN_Time,AB_Time以秒为单位。我想要统计每个列的每10分钟和5分钟范围内的呼叫数量。

我写了这样的事情:

SELECT ARR_date, 
CASE WHEN AN_TIME <300 THEN 1 ELSE 0 END AS AN_5_min , 
case WHEN AN_TIME <600 THEN 1 ELSE 0 END AS AN_10_min, 
CASE WHEN AB_TIME <300 THEN 1 ELSE 0 END AS AB_5_min , 
case WHEN AB_TIME <600 THEN 1 ELSE 0 END AS AB_10_min 
FROM Call_Data 
GROUP BY AR_Date,AN_TIME,AB_TIME 

但这并不GICE我电话的总numbe。谁能帮我?

回答

3

你接近:

SELECT 
    ARR_date, 
    COUNT(*) AS Total_calls, 
    SUM(CASE WHEN AN_TIME <300 THEN 1 ELSE 0 END) AS AN_5_min , 
    SUM(CASE WHEN AN_TIME <600 THEN 1 ELSE 0 END) AS AN_10_min, 
    SUM(CASE WHEN AB_TIME <300 THEN 1 ELSE 0 END) AS AB_5_min , 
    SUM(CASE WHEN AB_TIME <600 THEN 1 ELSE 0 END) AS AB_10_min 
FROM Call_Data 
GROUP BY AR_Date 

您还可以使用NULLCOUNT显示(任何未来的编码器),你实际上计算的呼叫,而不是总结:

SELECT 
    ARR_date, 
    COUNT(*) AS Total_calls, 
    COUNT(CASE WHEN AN_TIME <300 THEN 1 ELSE NULL END) AS AN_5_min , 
    COUNT(CASE WHEN AN_TIME <600 THEN 1 ELSE NULL END) AS AN_10_min, 
    COUNT(CASE WHEN AB_TIME <300 THEN 1 ELSE NULL END) AS AB_5_min , 
    COUNT(CASE WHEN AB_TIME <600 THEN 1 ELSE NULL END) AS AB_10_min 
FROM Call_Data 
GROUP BY AR_Date 
2

你是几乎在那里,只是总结了列

SELECT 
    ARR_date, 
    SUM(AN_5_min) AN_5_min, 
    SUM(AN_10_min) AN_10_min, 
    SUM(AB_5_min) AB_5_min, 
    SUM(AB_10_min) AB_10_min 
FROM 
    (SELECT 
     ARR_date, 
     CASE WHEN AN_TIME <300 THEN 1 ELSE 0 END AS AN_5_min, 
     case WHEN AN_TIME <600 THEN 1 ELSE 0 END AS AN_10_min, 
     CASE WHEN AB_TIME <300 THEN 1 ELSE 0 END AS AB_5_min, 
     case WHEN AB_TIME <600 THEN 1 ELSE 0 END AS AB_10_min 
    FROM 
     Call_Data) TBL 
GROUP BY 
    ARR_date 
+0

有两个问题:(1)为什么子查询? (2)Total_Calls列在哪里? –

+0

(1)有时看起来更容易扩展(2)将Count(*)OVER(PARTITION by ARR_Date)添加为Total_Calls,“应该得到总计 –

1
SELECT Arr_Date, COUNT(*) AS Total_Calls, 
    SUM(CASE WHEN AN_TIME <300 THEN 1 ELSE 0 END) AS AN_5_min , 
    SUM(case WHEN AN_TIME <600 THEN 1 ELSE 0 END) AS AN_10_min, 
    SUM(CASE WHEN AB_TIME <300 THEN 1 ELSE 0 END) AS AB_5_min , 
    SUM(case WHEN AB_TIME <600 THEN 1 ELSE 0 END) AS AB_10_min 
FROM dbo.Call_Data 
GROUP BY Arr_Date 
ORDER BY Arr_Date;