Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.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 如何在此查询中使用count语句?_Sql - Fatal编程技术网

Sql 如何在此查询中使用count语句?

Sql 如何在此查询中使用count语句?,sql,Sql,我必须在船上显示起重机每天的工作时间和总箱数。 例如,名为FG1的起重机可能从2019年9月25日晚上8点工作到2019年9月26日凌晨3点。查询需要显示两个信息,即从2019年9月25日晚上8点到晚上11点59分的合计框和从2019年9月26日上午12点到凌晨3点的合计框。问题是,它没有正确计算两个日期之间的合计框 SELECT SUBSTR (b.user_voy, 1, 12) JPVC , NVL (SUBSTR (TO_CHAR (MIN (g.actual_time), 'YY

我必须在船上显示起重机每天的工作时间和总箱数。 例如,名为FG1的起重机可能从2019年9月25日晚上8点工作到2019年9月26日凌晨3点。查询需要显示两个信息,即从2019年9月25日晚上8点到晚上11点59分的合计框和从2019年9月26日上午12点到凌晨3点的合计框。问题是,它没有正确计算两个日期之间的合计框

SELECT SUBSTR (b.user_voy, 1, 12) JPVC
  , NVL (SUBSTR (TO_CHAR  (MIN (g.actual_time), 'YYYY-MM-DD HH24:MI:SS'), 1, 20),'-') FIRSTLIFT
  , NVL (SUBSTR (TO_CHAR  (MAX (g.actual_time), 'YYYY-MM-DD HH24:MI:SS'), 1, 20),'-') LASTLIFT
  , (
    select Count(actual_time)
    from tb_gc_odr
    where actual_time IS NOT NULL
      and equ_no = g.equ_no
      and vsl_cd = t.vsl_cd
      AND call_year = t.call_year
      AND call_seq = t.call_seq
    ) as COM_TOTAL
  , SUBSTR((ROUND((((FLOOR(((MAX(g.actual_time)) - (MIN(g.actual_time))) * 24)) * 60) + (MOD(FLOOR(((MAX(g.actual_time)) - (MIN(g.actual_time))) * 24 * 60), 60))) / 60, 2) || ' '), 1, 18) WH
FROM tb_gc_odr g
  , tb_master t
  , tb_berthplan b
WHERE 1 = 1
  AND g.vsl_cd = t.vsl_cd
  AND g.call_year = t.call_year
  AND g.call_seq = t.call_seq
  AND g.cntr_no = t.cntr_no
  AND g.cntr_seq = t.cntr_seq
  AND b.call_year = t.call_year
  AND b.call_seq = t.call_seq
  AND b.vsl_cd = t.vsl_cd
  AND g.cntr_seq = t.cntr_seq
  AND t.cntr_seq = '0'
  AND t.cargo_type <> 'BB'
  AND g.equ_no = 'FG1'
  AND TO_CHAR(g.actual_time, 'MM/DD/YYYY') between '09/23/2019' and '09/26/2019'
GROUP BY t.vsl_cd
  , t.call_year
  , t.call_seq
  , g.equ_no
  , b.user_voy
  , TO_CHAR(g.actual_time, 'MM/DD/YYYY')
order by g.equ_no
  , FIRSTLIFT
期望:

实际结果:

有没有办法在FIRSTLIFT和LASTLIFT之间显示总计框

编辑: 这是我得到的样本数据

FIRSTLIFT:LASTLIFT:JPVC:工作时间:TOTALBOX

2019-09-23 00:02:07:2019-09-23 04:10:15:19KITN-0518S:4.13:84

2019-09-2407:37:47:2019-09-2417:42:03:19KITN-0519S:10.07:210

2019-09-2421:36:23:2019-09-2423:59:07:19HBRM-HM134:2.37:177

2019-09-25 00:01:25:2019-09-25 05:34:07:19HBRM-HM134:5.53:177

2019-09-2509:21:18:2019-09-2512:28:51:19D112-7262:3.12:110

2019-09-25 15:57:29:2019-09-25 23:57:35:19BDGM-BM193:8:195

2019-09-26 00:00:58:2019-09-26 03:37:30:19BDGM-BM193:3.6:195

最新更新:


没关系。我已经弄明白了。需要添加和到字符时间,'MM/DD/YYYY'=到字符g.actual\u时间,'MM/DD/YYYY'

如果没有样本数据,很难回答这个问题,但您的计算不会将结果限制在指定的时间内

您需要包括以下内容:

(select Count(actual_time) 
from tb_gc_odr 
where actual_time IS NOT NULL 
and equ_no= g.equ_no 
and vsl_cd = t.vsl_cd 
AND call_year = t.call_year 
AND call_seq = t.call_seq 
and actual_time > NVL (SUBSTR (TO_CHAR  (MIN (g.actual_time), 'YYYY-MM-DD HH24:MI:SS'), 1, 20),'-')
and actual_time < NVL (SUBSTR (TO_CHAR  (MAX (g.actual_time), 'YYYY-MM-DD HH24:MI:SS'), 1, 20),'-')
) as COM_TOTAL,

如果您可以显示一些示例数据,以及数据的外观,那么解决问题就容易一点。 但是我想在u使用的子查询中添加,您必须为日期添加更多参数,我认为这些参数包含所有数据

(
  select Count(actual_time) 
  from tb_gc_odr
  where actual_time IS NOT NULL
    and equ_no = g.equ_no 
    and vsl_cd = t.vsl_cd
    AND call_year = t.call_year 
    AND call_seq = t.call_seq
    AND actual_time between '*datefrom*' and '*dateto*'
) as COM_TOTAL

你必须过滤数据。我试图解决您的问题

尝试从表tb\u gc\u odr中添加时间分组,如下所示:

select g.*,case 
            when to_char(g.actual_time,'hh24mi') <= 300 or to_char(g.actual_time,'hh24mi')  >= 2000 then 'group 1' 
            when to_char(g.actual_time,'hh24mi') > 300 or to_char(g.actual_time,'hh24mi')  < 2000 then 'group 2'
            end as group_time from tb_gc_odr g
SELECT SUBSTR (b.user_voy, 1, 12) JPVC
  , NVL (SUBSTR (TO_CHAR  (MIN (g.actual_time), 'YYYY-MM-DD HH24:MI:SS'), 1, 20),'-') FIRSTLIFT
  , NVL (SUBSTR (TO_CHAR  (MAX (g.actual_time), 'YYYY-MM-DD HH24:MI:SS'), 1, 20),'-') LASTLIFT
  , (
    select Count(actual_time)
    from tb_gc_odr
    where actual_time IS NOT NULL
      and equ_no = g.equ_no
      and vsl_cd = t.vsl_cd
      AND call_year = t.call_year
      AND call_seq = t.call_seq
    ) as COM_TOTAL
  , SUBSTR((ROUND((((FLOOR(((MAX(g.actual_time)) - (MIN(g.actual_time))) * 24)) * 60) + (MOD(FLOOR(((MAX(g.actual_time)) - (MIN(g.actual_time))) * 24 * 60), 60))) / 60, 2) || ' '), 1, 18) WH
FROM (select g.*,case 
            when to_char(g.actual_time,'hh24mi') <= 300 or to_char(g.actual_time,'hh24mi')  >= 2000 then 'group 1' 
            when to_char(g.actual_time,'hh24mi') > 300 or to_char(g.actual_time,'hh24mi')  < 2000 then 'group 2'
            end as group_time from tb_gc_odr g
            ) g
  , tb_master t
  , tb_berthplan b
WHERE 1 = 1
  AND g.vsl_cd = t.vsl_cd
  AND g.call_year = t.call_year
  AND g.call_seq = t.call_seq
  AND g.cntr_no = t.cntr_no
  AND g.cntr_seq = t.cntr_seq
  AND b.call_year = t.call_year
  AND b.call_seq = t.call_seq
  AND b.vsl_cd = t.vsl_cd
  AND g.cntr_seq = t.cntr_seq
  AND t.cntr_seq = '0'
  AND t.cargo_type <> 'BB'
  AND g.equ_no = 'FG1'
  AND TO_CHAR(g.actual_time, 'MM/DD/YYYY') between '09/23/2019' and '09/26/2019'
GROUP BY t.vsl_cd
  , t.call_year
  , t.call_seq
  , g.equ_no
  , b.user_voy
  , g.group_time
order by g.equ_no
  , FIRSTLIFT
因此,您对完整案例的查询如下:

select g.*,case 
            when to_char(g.actual_time,'hh24mi') <= 300 or to_char(g.actual_time,'hh24mi')  >= 2000 then 'group 1' 
            when to_char(g.actual_time,'hh24mi') > 300 or to_char(g.actual_time,'hh24mi')  < 2000 then 'group 2'
            end as group_time from tb_gc_odr g
SELECT SUBSTR (b.user_voy, 1, 12) JPVC
  , NVL (SUBSTR (TO_CHAR  (MIN (g.actual_time), 'YYYY-MM-DD HH24:MI:SS'), 1, 20),'-') FIRSTLIFT
  , NVL (SUBSTR (TO_CHAR  (MAX (g.actual_time), 'YYYY-MM-DD HH24:MI:SS'), 1, 20),'-') LASTLIFT
  , (
    select Count(actual_time)
    from tb_gc_odr
    where actual_time IS NOT NULL
      and equ_no = g.equ_no
      and vsl_cd = t.vsl_cd
      AND call_year = t.call_year
      AND call_seq = t.call_seq
    ) as COM_TOTAL
  , SUBSTR((ROUND((((FLOOR(((MAX(g.actual_time)) - (MIN(g.actual_time))) * 24)) * 60) + (MOD(FLOOR(((MAX(g.actual_time)) - (MIN(g.actual_time))) * 24 * 60), 60))) / 60, 2) || ' '), 1, 18) WH
FROM (select g.*,case 
            when to_char(g.actual_time,'hh24mi') <= 300 or to_char(g.actual_time,'hh24mi')  >= 2000 then 'group 1' 
            when to_char(g.actual_time,'hh24mi') > 300 or to_char(g.actual_time,'hh24mi')  < 2000 then 'group 2'
            end as group_time from tb_gc_odr g
            ) g
  , tb_master t
  , tb_berthplan b
WHERE 1 = 1
  AND g.vsl_cd = t.vsl_cd
  AND g.call_year = t.call_year
  AND g.call_seq = t.call_seq
  AND g.cntr_no = t.cntr_no
  AND g.cntr_seq = t.cntr_seq
  AND b.call_year = t.call_year
  AND b.call_seq = t.call_seq
  AND b.vsl_cd = t.vsl_cd
  AND g.cntr_seq = t.cntr_seq
  AND t.cntr_seq = '0'
  AND t.cargo_type <> 'BB'
  AND g.equ_no = 'FG1'
  AND TO_CHAR(g.actual_time, 'MM/DD/YYYY') between '09/23/2019' and '09/26/2019'
GROUP BY t.vsl_cd
  , t.call_year
  , t.call_seq
  , g.equ_no
  , b.user_voy
  , g.group_time
order by g.equ_no
  , FIRSTLIFT

您肯定在查询中缺少联接条件,这就是为什么com_total不正确的原因。我以前尝试过这个方法,但它似乎返回了一个错误。它说这里不允许使用组函数。顺便说一句,我之前已经在post中包含了示例数据,但是结果仍然是一样的。尝试使用>=和
SELECT SUBSTR (b.user_voy, 1, 12) JPVC
  , NVL (SUBSTR (TO_CHAR  (MIN (g.actual_time), 'YYYY-MM-DD HH24:MI:SS'), 1, 20),'-') FIRSTLIFT
  , NVL (SUBSTR (TO_CHAR  (MAX (g.actual_time), 'YYYY-MM-DD HH24:MI:SS'), 1, 20),'-') LASTLIFT
  , (
    select Count(actual_time)
    from tb_gc_odr
    where actual_time IS NOT NULL
      and equ_no = g.equ_no
      and vsl_cd = t.vsl_cd
      AND call_year = t.call_year
      AND call_seq = t.call_seq
    ) as COM_TOTAL
  , SUBSTR((ROUND((((FLOOR(((MAX(g.actual_time)) - (MIN(g.actual_time))) * 24)) * 60) + (MOD(FLOOR(((MAX(g.actual_time)) - (MIN(g.actual_time))) * 24 * 60), 60))) / 60, 2) || ' '), 1, 18) WH
FROM (select g.*,case 
            when to_char(g.actual_time,'hh24mi') <= 300 or to_char(g.actual_time,'hh24mi')  >= 2000 then 'group 1' 
            when to_char(g.actual_time,'hh24mi') > 300 or to_char(g.actual_time,'hh24mi')  < 2000 then 'group 2'
            end as group_time from tb_gc_odr g
            ) g
  , tb_master t
  , tb_berthplan b
WHERE 1 = 1
  AND g.vsl_cd = t.vsl_cd
  AND g.call_year = t.call_year
  AND g.call_seq = t.call_seq
  AND g.cntr_no = t.cntr_no
  AND g.cntr_seq = t.cntr_seq
  AND b.call_year = t.call_year
  AND b.call_seq = t.call_seq
  AND b.vsl_cd = t.vsl_cd
  AND g.cntr_seq = t.cntr_seq
  AND t.cntr_seq = '0'
  AND t.cargo_type <> 'BB'
  AND g.equ_no = 'FG1'
  AND TO_CHAR(g.actual_time, 'MM/DD/YYYY') between '09/23/2019' and '09/26/2019'
GROUP BY t.vsl_cd
  , t.call_year
  , t.call_seq
  , g.equ_no
  , b.user_voy
  , g.group_time
order by g.equ_no
  , FIRSTLIFT