Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
Sql 我怎样才能得到总数?_Sql_Oracle_Count_Sum_Oracle Sqldeveloper - Fatal编程技术网

Sql 我怎样才能得到总数?

Sql 我怎样才能得到总数?,sql,oracle,count,sum,oracle-sqldeveloper,Sql,Oracle,Count,Sum,Oracle Sqldeveloper,我无法获得确切的查询以获得total表的全部合计。我想得到call_时间表中每个日期的总数。我的问题是: SELECT call_type, channel, call_time, count (CASE WHEN upper(status) = upper('no answer') THEN 1 ELSE NULL END) AS cnt_no_answer, count (CASE WHEN upper(status) = upper('answered') TH

我无法获得确切的查询以获得total表的全部合计。我想得到call_时间表中每个日期的总数。我的问题是:

SELECT call_type, channel, call_time,
       count (CASE WHEN upper(status) = upper('no answer') THEN 1 ELSE NULL END) AS cnt_no_answer,
       count (CASE WHEN upper(status) = upper('answered') THEN 1 ELSE NULL END) AS cnt_answer,
       count (status) AS cnt_total
FROM   app_account.cc_call
WHERE  channel = 'DAHDI/i1/'
AND    call_time BETWEEN ('30-DEC-2013') AND ('04-JAN-2014')
GROUP BY call_type, channel, call_time;
该查询的某些输出:

CALL_TYPE        CHANNEL    CALL_TIME CNT_NO_ANSWER  CNT_ANSWERED   CNT_TOTAL
LANDLINE         DAHDI/i1/  03-JAN-14     1            0               1
MOBILE-SUN       DAHDI/i1/  03-JAN-14     0            1               1
MOBILE-SUN       DAHDI/i1/  03-JAN-14     1            0               1
LANDLINE         DAHDI/i1/  03-JAN-14     1            0               1
LANDLINE         DAHDI/i1/  03-JAN-14     1            0               1
LANDLINE         DAHDI/i1/  03-JAN-14     1            0               1
MOBILE-SUN       DAHDI/i1/  02-JAN-14     1            0               1
MOBILE-SUN       DAHDI/i1/  02-JAN-14     0            1               1
LANDLINE         DAHDI/i1/  02-JAN-14     0            1               1
LANDLINE         DAHDI/i1/  02-JAN-14     1            0               1
MOBILE-SMART     DAHDI/i1/  02-JAN-14     1            0               1
我的例外输出:

CALL_TIME  CNT_NO_ANSWER CNT_ANSWERED
03-JAN-14   27             10   
02-JAN-14   48             20   
请帮帮我

谢谢大家!

试试这个:

SELECT CALL_TYPE, CHANNEL, TRUNC(CALL_TIME)
      ,COUNT (CASE WHEN UPPER(STATUS) = UPPER('no answer') THEN 1 END) AS CNT_NO_ANSWER
      ,COUNT (CASE WHEN UPPER(STATUS) = UPPER('answered') THEN 1 END) AS CNT_ANSWER
      ,COUNT (STATUS) AS CNT_TOTAL
FROM APP_ACCOUNT.CC_CALL
WHERE CHANNEL = 'DAHDI/i1/'
AND CALL_TIME BETWEEN ('30-DEC-2013') AND ('04-JAN-2014')
GROUP BY CALL_TYPE, CHANNEL, TRUNC(CALL_TIME);

如果
CALL\u TIME
包含时间值,并且您希望
GROUP BY
每个日期,您应该
trunc
CALL\u TIME
设置为其日期。

要获得按天计数,您需要使用
CALL\u TIME
进行分组。试着这样,

SELECT call_type, 
       channel, 
       trunc(call_time),
       count (CASE WHEN upper(status) = upper('no answer') THEN 1 ELSE NULL END) AS cnt_no_answer,
       count (CASE WHEN upper(status) = upper('answered') THEN 1 ELSE NULL END) AS cnt_answer
FROM   happ_account.cc_call
WHERE  channel = 'DAHDI/i1/'
AND    call_time BETWEEN to_date('30-DEC-2013', 'DD-MON-YYYY') AND to_date('04-JAN-2014', 'DD-MON-YYYY')
GROUP BY call_type, channel, trunc(call_time);

使用类似以下内容:

  SELECT CALL_TYPE, CHANNEL, TRUNC(CALL_TIME)
         , COUNT (CASE UPPER(STATUS)
                     WHEN UPPER('no answer') THEN 1
                     ELSE NULL
                  END) AS CNT_NO_ANSWER
         , COUNT (CASE UPPER(STATUS)
                       WHEN UPPER('answered') THEN 1
                       ELSE NULL
                  END) AS CNT_ANSWER
         , COUNT (STATUS) AS CNT_TOTAL
    FROM APP_ACCOUNT.CC_CALL
   WHERE CHANNEL = 'DAHDI/i1/'
     AND CALL_TIME BETWEEN TO_DATE('30-DEC-2013')
                       AND TO_DATE('04-JAN-2014')
GROUP BY CALL_TYPE, CHANNEL, TRUNC(CALL_TIME);
我所做的主要改变是
TRUNC(通话时间)
。Oracle将日期存储为datetime值,该值包含日期和时间值。因此,当您使用
groupby…、CALL_TIME…
时,真正发生的是对日期时间值进行分组,而不是对日期值进行分组。只有在精确到几分之一秒的准确时间发出的呼叫才会被分组在一起,这不是预期的行为。因此,当您必须按天显示分组时,请使用
groupbytrunc(CALL\u DATE)

编辑:

要获取每天的总金额,您已经在查询中使用了
COUNT(STATUS)作为CNT_total
!如果列为NOTNULL并且记录了每个调用的状态,那么它将为您提供调用的总数。如果此列包含空值,我建议您使用
COUNT(*)作为CNT_TOTAL
,因为它将计算所有行,而不考虑列上的约束

对于“每天”部分,
TRUNC(datetime)
函数可以将日期时间值从年份截断到分钟。这意味着,如果您想获得每年的呼叫数或任何其他统计数据,那么您只需使用
TRUNC(call_time,'YYYY')
。另一方面,如果您需要每小时的通话统计信息,可以使用
TRUNC(call\u time,'HH')
TRUNC(call\u time,'HH24')
。一分钟也一样

但是要注意,除非您使用
TO_CHAR
函数来显示日期,否则像Toad或SQL Developer这样的前端开发工具会以DD-MON-YYYY格式显示日期时间值,从而丢弃时间信息。这就是你最初的动机。因此,如果您通过将日期时间截断为一小时或一分钟来分组,即使结果正确,您也会看到DD-MON-YYYY格式的重复日期。因此,不要感到困惑


对于
TRUNC
的进一步阅读,我建议和。对于
TO_CHAR
,有详细易懂的解释。

您能发布一些示例数据和预期输出吗?您的查询中有什么不起作用?@Rachcha我已经把OUTPUT@Szymon其实没有,但是我想得到一个查询,该查询将得到每个日期的总数,如果频道表中有相同的数据,则将其区分开来。您的呼叫时间是否也包含时间部分,还是仅包含日期?感谢buddy的查询,其运行正常:)欢迎使用StackOverflow!如果你发现一个人们认为有用且写得好的问题或答案,人们会投票表决。如果你发现问题的答案满足你的要求,你就接受它。这确实是一个非常令人愉快的评论,但在这里,感谢通常是通过向上投票和接受分数来表达的。嘿,伙计,我还有一个问题。我想得到每天的总数?是的,但我的意思是,我需要得到每天没有回答和回答的总数。有一件事要问:
状态
列中除了
“回答”
“没有回答”
,还有其他值吗?