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