Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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 - Fatal编程技术网

Sql 子查询中的进一步分组周数

Sql 子查询中的进一步分组周数,sql,oracle,Sql,Oracle,我试图从2列中减去值,并将它们分组到第周。 “事件代码”列的值为3,4。我试图将事件代码4的持续时间求和,并减去事件代码3的持续时间。需要在过去12周内得出这些值 这是我到目前为止所拥有的。我是材料,并按周数进一步分组: SELECT DISTINCT CUSTOMER_ID, ((SELECT SUM(DURATION_IN_SECONDS)/60 FROM TABLE1 ee WHERE ee.CUSTOMER_ID = e.CUSTOMER_ID AND EVENT_CODE IN (4)

我试图从2列中减去值,并将它们分组到第周。 “事件代码”列的值为3,4。我试图将事件代码4的持续时间求和,并减去事件代码3的持续时间。需要在过去12周内得出这些值

这是我到目前为止所拥有的。我是材料,并按周数进一步分组:

SELECT DISTINCT CUSTOMER_ID,
((SELECT SUM(DURATION_IN_SECONDS)/60 FROM TABLE1 ee WHERE ee.CUSTOMER_ID = e.CUSTOMER_ID AND EVENT_CODE IN (4))-
(SELECT SUM(DURATION_IN_SECONDS)/60 FROM TABLE1 ee WHERE ee.CUSTOMER_ID = e.CUSTOMER_ID AND EVENT_CODE IN (3))) AS UNPRODUCTIVE_MINUTES
FROM  TABLE1 e
WHERE TIMEDATE >= TO_DATE('01-OCT-19','DD-MON-YY') 
AND TIMEDATE <= TO_DATE('31-DEC-19','DD-MON-YY')
GROUP BY CUSTOMER_ID
但我的结果必须是这样的:

CUSTOMER_ID   UNPRODUCTIVE_MINUTES
A100          1601
CUSTOMER_ID       WEEKNUMBER  UNPRODUCTIVE_MINUTES
A100              12            171
A100              11            108
A100              10            112
A100              9             110
A100              8             98
A100              7             67
A100              6             117
A100              5             100
A100              4             111
A100              3             77
A100              2             73
A100              1             87

我不确定您想如何计算周数,但我猜周数是
(timedate-start timedate/7)+1
,因此创建相应的查询

Select customer_id,
       Sum(case when EVENT_CODE = 4 then DURATION_IN_SECONDS else (-1* DURATION_IN_SECONDS) end)/60 as dur,
       Floor(Trunc(timedate) - TO_DATE('01-OCT-19','DD-MON-YY') / 7) + 1 as weeknumber
  From table1 e
 Where TIMEDATE >= TO_DATE('01-OCT-19','DD-MON-YY') 
   AND TIMEDATE <= TO_DATE('31-DEC-19','DD-MON-YY')
   AND EVENT_CODE in (3, 4)
GROUP BY CUSTOMER_ID, floor(trunc(timedate) - TO_DATE('01-OCT-19','DD-MON-YY') / 7) + 1
选择客户id,
总和(当事件代码=4时,则持续时间(以秒计)或-1*持续时间(以秒计)结束)/60作为dur,
楼层(Trunc(timedate)-截止日期('19年10月1日','YY月日')/7)+1周编号
来自表1 e
其中TIMEDATE>=截止日期('19年10月1日','DD-MON-YY')
和时间日期
  • TO_CHAR(TIMEDATE,'ww')
    函数可直接用于 确定周数
  • 无需使用
    相关子查询
    ,但
    条件聚合
    应该改用
  • 根据ISO标准将日期重新格式化为日期'yyyy-mm-dd'
,如下所示
  • 对于包含的日期范围,使用BETWEEN运算符就足够了,而不是 不平等

    质疑


  • 谢谢你@Tejash。它必须是事件代码4的持续时间总和-事件代码3的持续时间总和。
    SELECT CUSTOMER_ID,
           TO_CHAR(TIMEDATE, 'ww') AS WEEK,
           NVL(SUM(CASE
                     WHEN EVENT_CODE = 4 THEN
                      DURATION_IN_SECONDS / 60
                   END),
               0) - NVL(SUM(CASE
                              WHEN EVENT_CODE = 3 THEN
                               DURATION_IN_SECONDS / 60
                            END),
                        0) AS UNPRODUCTIVE_MINUTES
      FROM TABLE1 e
     WHERE TIMEDATE BETWEEN DATE '2019-10-01' AND DATE '2019-12-31'
     GROUP BY CUSTOMER_ID, TO_CHAR(TIMEDATE, 'ww')
     ORDER BY CUSTOMER_ID, WEEK