【问题标题】:Sum Every N Records SQL每 N 条记录求和 SQL
【发布时间】:2023-03-15 14:27:01
【问题描述】:

我有这个查询,它返回(“查询结果”正下方)一个分组日期(varchar)和一些值。 它们是经过收费站的车辆。

SELECT SUBSTR(CAB_MOMENTO,1,12),
Sum(CASE WHEN COMVSAUTO = '1' AND NOME IN ('SUL','OESTE') THEN 1 ELSE 0 END) 
SUL_OESTE_AUTO,
Sum(CASE WHEN COMVSAUTO = '0' AND NOME IN ('SUL','OESTE') THEN 1 ELSE 0 END) 
SUL_OESTE_COM,
Sum(CASE WHEN COMVSAUTO = '1' AND NOME IN ('NORTE','LESTE') THEN 1 ELSE 0 
END) NORTE_LESTE_AUTO,
Sum(CASE WHEN COMVSAUTO = '0' AND NOME IN ('NORTE','LESTE') THEN 1 ELSE 0 
END) NORTE_LESTE_COM FROM
(SELECT a.idtransaccion, a.cab_momento, a.cab_via, a.comvsauto, b.NOME
FROM
(select idtransaccion, cab_momento, cab_via, cab_estacion AS ESTACION,
CASE ctl_clase
WHEN '01' THEN 1
WHEN '07' THEN 1
WHEN '08' THEN 1
ELSE 0
END comvsauto
FROM usrhost.atransaccion
WHERE cab_momento > '20170818000000') a
INNER join
(SELECT sen.estacion AS ESTACION, via.via AS VIA, sen.nome AS NOME FROM 
usrhost.aestacion_sentido sen
INNER JOIN usrhost.avia via ON
sen.estacion = via.estacion
AND SubStr(via.via,3,1) = sen.sentido
ORDER BY 1,2) b ON
b.VIA = a.cab_via
AND b.ESTACION = a.ESTACION)
GROUP BY SUBSTR(CAB_MOMENTO,1,12)
ORDER BY 1

我需要每 15 分钟的总和(第一列)。

例如: 从 X 分钟到 Y 分钟 - 1231 | 12314 |第1241章21415 从 X+15 分钟到 Y+15 分钟 - 1111 | 13344 |第1345章22455 ...

提前致谢

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    努力吧!非常感谢。

    SELECT SubStr(CAB_MOMENTO,1,10) ||' '||
       CASE WHEN To_Number(SubStr(cab_momento,11,2)) < 15 THEN '00-15'
            WHEN To_Number(SubStr(cab_momento,11,2)) < 30 THEN '15-30'
            WHEN To_Number(SubStr(cab_momento,11,2)) < 45 THEN '30-45'
            ELSE '45-00'
       END As time_period, Sum(sul_oeste_auto), 
    Sum(sul_oeste_com),Sum(norte_leste_auto), Sum(norte_leste_com)
    FROM (
    
    SELECT SUBSTR(CAB_MOMENTO,1,12) AS cab_momento,
    Sum(CASE WHEN COMVSAUTO = '1' AND NOME IN ('SUL','OESTE') THEN 1 ELSE 0 END) 
    SUL_OESTE_AUTO,
    Sum(CASE WHEN COMVSAUTO = '0' AND NOME IN ('SUL','OESTE') THEN 1 ELSE 0 END) 
    SUL_OESTE_COM,
    Sum(CASE WHEN COMVSAUTO = '1' AND NOME IN ('NORTE','LESTE') THEN 1 ELSE 0 
    END) NORTE_LESTE_AUTO,
    Sum(CASE WHEN COMVSAUTO = '0' AND NOME IN ('NORTE','LESTE') THEN 1 ELSE 0 
    END) NORTE_LESTE_COM FROM
    (SELECT a.idtransaccion, a.cab_momento, a.cab_via, a.comvsauto, b.NOME
    FROM
    (select idtransaccion, cab_momento, cab_via, cab_estacion AS ESTACION,
    CASE ctl_clase
    WHEN '01' THEN 1
    WHEN '07' THEN 1
    WHEN '08' THEN 1
    ELSE 0
    END comvsauto
    FROM usrhost.atransaccion
    WHERE cab_momento > '20170818000000') a
    INNER join
    (SELECT sen.estacion AS ESTACION, via.via AS VIA, sen.nome AS NOME FROM 
    usrhost.aestacion_sentido sen
    INNER JOIN usrhost.avia via ON
    sen.estacion = via.estacion
    AND SubStr(via.via,3,1) = sen.sentido
    ORDER BY 1,2) b ON
    b.VIA = a.cab_via
    AND b.ESTACION = a.ESTACION)
    GROUP BY SUBSTR(CAB_MOMENTO,1,12)
    ORDER BY 1)
    GROUP  BY SubStr(CAB_MOMENTO,1,10),CASE WHEN 
    To_Number(SubStr(cab_momento,11,2)) < 15 THEN '00-15'
            WHEN To_Number(SubStr(cab_momento,11,2)) < 30 THEN '15-30'
            WHEN To_Number(SubStr(cab_momento,11,2)) < 45 THEN '30-45'
            ELSE '45-00'
       END 
    

    按 1 排序

    【讨论】:

      【解决方案2】:

      您可以使用下面的表达式为您提供一个将分钟调整为一刻钟的日期时间。这将使您能够轻松地对时间和日期进行分组。

      CONVERT(datetime, LEFT(CONVERT(varchar(30), cab_momento, 126), 14) + RIGHT('0' + CONVERT(varchar(2), DATEPART(MINUTE, cab_momento) / 15 * 15), 2) + ':00.000', 126)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-04
        • 1970-01-01
        • 1970-01-01
        • 2020-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多