Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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 M(求和(当(TRUNC(到期日)>SYSDATE时的情况)然后1,否则0结束))超过(按状态划分)作为未来的总计, SUM(SUM(当(TRUNC(到期日)=SYSDATE时的情况)然后1或0结束)超过(按状态划分)作为今天的总计, 超过(按状态划分)的_Sql_Oracle_Oracle11g - Fatal编程技术网

Sql M(求和(当(TRUNC(到期日)>SYSDATE时的情况)然后1,否则0结束))超过(按状态划分)作为未来的总计, SUM(SUM(当(TRUNC(到期日)=SYSDATE时的情况)然后1或0结束)超过(按状态划分)作为今天的总计, 超过(按状态划分)的

Sql M(求和(当(TRUNC(到期日)>SYSDATE时的情况)然后1,否则0结束))超过(按状态划分)作为未来的总计, SUM(SUM(当(TRUNC(到期日)=SYSDATE时的情况)然后1或0结束)超过(按状态划分)作为今天的总计, 超过(按状态划分)的,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,M(求和(当(TRUNC(到期日)>SYSDATE时的情况)然后1,否则0结束))超过(按状态划分)作为未来的总计, SUM(SUM(当(TRUNC(到期日)=SYSDATE时的情况)然后1或0结束)超过(按状态划分)作为今天的总计, 超过(按状态划分)的总和(总和(当(TRUNC(到期日) (或者对于更复杂的情况 Cube ),通过< > >它被设计成计算总计和子总数。虽然它不会给你相同的结构,正如您所期望的,您可以考虑使用 RoopUp < /C> >(或对于更复杂的情况 Cube < /

M(求和(当(TRUNC(到期日)>SYSDATE时的情况)然后1,否则0结束))超过(按状态划分)作为未来的总计, SUM(SUM(当(TRUNC(到期日)=SYSDATE时的情况)然后1或0结束)超过(按状态划分)作为今天的总计, 超过(按状态划分)的总和(总和(当(TRUNC(到期日)Hi,我已经尝试过分区,它给出了@GordonLinoff描述的“ORA-00937:非单一组函数”例外-应该可以工作。也许你错过了双倍
SUM
use?谢谢@GordonLinoff。是的,我错过了双和的用法。嗨,我已经试过分区了,它给出了“ORA-00937:不是一个单组函数”的例外,正如@GordonLinoff所描述的-它应该可以工作。也许你错过了双倍
SUM
use?谢谢@GordonLinoff。是的,我错过了双和使用。虽然它不会给你相同的结构,正如你所显示的,你可以考虑使用<代码> RoopUp> <代码>(或者对于更复杂的情况<代码> Cube ),通过< <代码> > >它被设计成计算总计和子总数。虽然它不会给你相同的结构,正如您所期望的,您可以考虑使用<代码> RoopUp < /C> >(或对于更复杂的情况<代码> Cube < /代码>)子句< <代码> > -它被设计成计算总计和子总计。这将是有益的,为什么<代码> Tunc < /代码>可以是好的。对于这些情况,最好展示如何在当天
到期日
,而不仅仅是过去/future.Hi@Hilarion;说实话,这有点伤人。您是在用解释批评正确答案,而不是在没有解释的情况下批评错误答案(不仅仅是SQL逻辑的日期)。我已经解释了为什么移动
TRUNC()
是好的,我也知道如何移动。我没有用“移动”这个词,这是真的,但它实际上不是移动一个函数,它是一个不同的逻辑结构。如果你不懂解释,你能告诉我你不懂什么,这样我可以改进我的解释吗?谢谢你@Ben。我唯一的难题是,你和戈登哪个方法更好。我试着做解释计划,两个查询的成本是相似的。在运行它们时,我所花费的时间也差不多。但我的本地数据库的测试数据有限。我必须看看它们在巨大负载下的表现。它们基本上是相同的查询@Sitaram,我不认为在大量数据中会有任何区别。您是否已检查返回的数据在这两个方面是否正确?这两种方法都可以修改以返回正确的数据,但看起来我们对您的问题的解释略有不同。是的,我能够得到预期的结果…谢谢:)了解
TRUNC
的移动为什么会很好会对您有所帮助。对于这些情况,最好展示如何在当天
到期日
,而不仅仅是过去/future.Hi@Hilarion;说实话,这有点伤人。您是在用解释批评正确答案,而不是在没有解释的情况下批评错误答案(不仅仅是SQL逻辑的日期)。我已经解释了为什么移动
TRUNC()
是好的,我也知道如何移动。我没有用“移动”这个词,这是真的,但它实际上不是移动一个函数,它是一个不同的逻辑结构。如果你不懂解释,你能告诉我你不懂什么,这样我可以改进我的解释吗?谢谢你@Ben。我唯一的难题是,你和戈登哪个方法更好。我试着做解释计划,两个查询的成本是相似的。在运行它们时,我所花费的时间也差不多。但我的本地数据库的测试数据有限。我必须看看它们在巨大负载下的表现。它们基本上是相同的查询@Sitaram,我不认为在大量数据中会有任何区别。您是否已检查返回的数据在这两个方面是否正确?任何一个都可以修改以返回正确的数据,但我们对您的问题的解释似乎略有不同。是的,我能够得到预期的结果…谢谢:) TASK_CD | STATUS | DUE_DATE ---------------------------------- T0001 | NW | SYSDATE + 1 T0001 | IP | SYSDATE T0001 | AG | SYSDATE T0002 | NW | SYSDATE - 1 T0002 | NW | SYSDATE - 2 T0003 | AG | SYSDATE + 1
select TASK_CD, STATUS, SUM(1) TOTALS, 
SUM(CASE WHEN (TRUNC(DUE_DATE ) > SYSDATE) then 1 else 0 end) FUTURE, 
SUM(CASE WHEN (TRUNC(DUE_DATE ) = SYSDATE) then 1 else 0 end) TODAY, 
SUM(CASE WHEN (TRUNC(DUE_DATE ) < SYSDATE) then 1 else 0 end) OVERDUE, 
FROM TM_TASK GROUP BY TASK_CD, STATUS;
TASK_CD | STATUS | TOTALS | FUTURE | TODAY | OVERDUE ---------------------------------------------------- T0001 | NW | 1 | 1 | 0 | 0 T0001 | IP | 1 | 0 | 1 | 0 T0001 | AG | 1 | 0 | 1 | 0 T0002 | NW | 2 | 0 | 0 | 2 T0003 | AG | 1 | 1 | 0 | 0 TASK_CD | TOTALS | FUTURE | TODAY | OVERDUE ----------------------------------------------- T0001 | 3 | 1 | 2 | 0 T0002 | 2 | 0 | 0 | 2 T0003 | 1 | 1 | 0 | 0 TASK_CD | STATUS | TOTALS | FUTURE | TODAY | OVERDUE| TOTALS_ALL | FUTURE_TOTAL | TODAY_TOTAL | OVERDUE_TOTAL T0001 | NW | 1 | 1 | 0 | 0 | 3 | 1 | 2 | 0 T0001 | IP | 1 | 0 | 1 | 0 | 3 | 1 | 2 | 0 T0001 | AG | 1 | 0 | 1 | 0 | 3 | 1 | 2 | 0 T0002 | NW | 2 | 0 | 0 | 2 | 2 | 0 | 0 | 2 T0003 | AG | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0
with initial_totals as (
select task_cd
     , status
     , count(*) as totals
     , sum(case when due_date >= trunc(sysdate) + 1 then 1 else 0 end) as future
     , sum(case when trunc(due_date) = trunc(sysdate) then 1 else 0 end) as today
     , sum(case when due_date < trunc(sysdate) then 1 else 0 end) as overdue
  from tm_task
 group by task_cd, status
       )
select task_cd
     , status
     , future
     , today
     , overdue
     , sum(future) over (partition by task_cd) as future_total
     , sum(today) over (partition by task_cd) as today_total
     , sum(overdue) over (partition by task_cd) as overdue_total
  from initial_totals
select TASK_CD, STATUS, SUM(1) TOTALS, 
       SUM(CASE WHEN (TRUNC(DUE_DATE ) > SYSDATE) then 1 else 0 end) as FUTURE, 
       SUM(CASE WHEN (TRUNC(DUE_DATE ) = SYSDATE) then 1 else 0 end) as TODAY, 
       SUM(CASE WHEN (TRUNC(DUE_DATE ) < SYSDATE) then 1 else 0 end) as OVERDUE, 
       SUM(SUM(CASE WHEN (TRUNC(DUE_DATE ) > SYSDATE) then 1 else 0 end)) OVER (PARTITION BY status) as TOTAL_FUTURE, 
       SUM(SUM(CASE WHEN (TRUNC(DUE_DATE ) = SYSDATE) then 1 else 0 end)) OVER (PARTITION BY status) as TOTAL_TODAY, 
       SUM(SUM(CASE WHEN (TRUNC(DUE_DATE ) < SYSDATE) then 1 else 0 end)) OVER (PARTITION BY status) as TOTAL_OVERDUE
FROM TM_TASK
GROUP BY TASK_CD, STATUS;