Sql 创建一个计数列,然后基于其他两列求和
我有一个名为call_logs sqlfidle的下表: 我想要一个名为Sql 创建一个计数列,然后基于其他两列求和,sql,sql-server,Sql,Sql Server,我有一个名为call_logs sqlfidle的下表: 我想要一个名为count\u duration列的新表,该表显示了x的call\u duration中有多少个call\u duration发生了60,90,15120次 如果通话时间为60分钟,通话持续时间为30分钟,则只有3个通话持续时间为30分钟 输出表如下所示: Date call_time(slot) call_duration Count duration 2011-10-01
count\u duration
列的新表,该表显示了x的call\u duration
中有多少个call\u duration
发生了60,90,15120次
如果通话时间为60分钟,通话持续时间为30分钟,则只有3个通话持续时间为30分钟
输出表如下所示:
Date call_time(slot) call_duration Count duration
2011-10-01 60 30 3
2007-02-03 90 30 2
2005-02-26 30 15 2
2015-10-01 180 30 1
2005-10-05 30 45 1
2020-02-03 90 30 5
2020-05-03 15 15 1
我尝试使用这个查询,但恐怕我必须输入每一个排列,我不确定它现在是否是最好的选择
select MAX(date),
SUM( case when call_time = '60' and call_duration = '15' then 1 else 0) as 60_15
,SUM( case when call_time = '60' and call_duration = '30' then 1 else 0) as 60_30
FROM Table1
group by date
感谢您的帮助您是否只需要
分组方式
select date, call_time, call_duration, count(*)
from table1
group by date, call_time, call_duration
order by date, count(*) desc;
这将计数放在单独的行而不是单独的列中——这实际上是您的结果的样子。听起来您可能希望按日期分组并按调用时间调用交叉表或数据透视列。调用持续时间是整数?像这样的
select [date], call_time,
sum(case when call_duration = 15 then 1 else 0) as duration_15
,sum(case when call_duration = 30 then 1 else 0) as duration_30
,sum(case when call_duration = 45 then 1 else 0) as duration_45
,sum(case when call_duration = 60 then 1 else 0) as duration_60
,sum(case when call_duration = 90 then 1 else 0) as duration_90
,sum(case when call_duration = 180 then 1 else 0) as duration_180
,sum(case when call_duration > 180 then 1 else 0) as duration_plus
from Table1
group by [date], call_time
如果您要将同一问题发布到,您至少可以将它们链接起来,以避免重复工作和信息的一致性“计数”如何为第一行生成34589的值?什么公式和什么值集计算该值?对于2015-10-01,您只有一行,但您在样本输出中的计数是10?注意-您的fiddle示例数据与此处显示的完全不同。@SMor,是的,它是不同的,但概念相同。该数据库可以保存多年,大约有200万行。我想做的是计算每个通话时间(时隙),例如60分钟,有多少人的通话持续时间为30分钟,或者每60个通话/时隙有多少人的通话持续时间为15分钟。您提供的查询只是给我一个单独的计数。我确实想知道,有多少人的通话时间为60次,有多少人的通话持续时间为30或15次。您提供的查询仅将其标记为1。
select [date], call_time,
sum(case when call_duration = 15 then 1 else 0) as duration_15
,sum(case when call_duration = 30 then 1 else 0) as duration_30
,sum(case when call_duration = 45 then 1 else 0) as duration_45
,sum(case when call_duration = 60 then 1 else 0) as duration_60
,sum(case when call_duration = 90 then 1 else 0) as duration_90
,sum(case when call_duration = 180 then 1 else 0) as duration_180
,sum(case when call_duration > 180 then 1 else 0) as duration_plus
from Table1
group by [date], call_time