0

The query shown below has line

COUNT(*) OVER() totalitems

that returns total number of rows and rows are ordered by 'numero DESC'

SELECT
    *
FROM
    (
        SELECT
            a.*,
            ROWNUM r__
        FROM
            (
                SELECT
                    b.*,
                    COUNT(*) OVER() totalitems
                FROM
                    (
                        SELECT
                            0 isplanned,
                            1 tipo,
                            a.anexo,
                            la.accepted, --novo atende, não atende
                            av.assessmentvaluedescription, --otímo, bom, ruim, regular
                            a.cd_atividade,
                            a.cd_componente cd_componente,
                            a.cd_fabrica,
                            a.cd_tipo,
                            a.data_inicio data,
                            a.ds_equipamento maquina,
                            a.hora_inicio, --hora de abertura da ordem
                            a.maq_parada AS equipmentdown,
                            a.minuto_inicio, --minuto de abertura da ordem
                            a.numero numero,
                            a.obs, --descrição solicitação
                            a.recomendacao, --merge das observacoes dos funcionarios
                            la.reasonforrejection, --razão não aceite
                            a.solicitante solicitante, --nome solicitante
                            a.status status, --status 'B' ou 'G'
                            a.status_andamento_tipo_desc, --motivo parada
                            a.status_andamento_tipo, --código motivo status andamento parado
                            avaliacao_solicitante avaliacao_solicitante, --avaliação antiga
                            b.data_baixa_individual, --data em que manutentor fez serviço
                            b.hr_fim hora2, --hora fim manut
                            b.hr_ini hora1, --hora inicio manut
                            b.hr_total horatotal,
                            b.obs_func recomendacao3, --observação manutentor
                            c.cadastro cadastro, --código manutentor
                            c.nome nome, --manutentor
                            cd_mantenedor cd_mantenedor, --código manutentor alocado
                            d.nome ds_mantenedor, --funcionario alocado
                            f.ds_fabrica namefactory,
                            fs.cadastro cd_solicitante,
                            g.cd_maquina,
                            m.criticidade AS critical,
                            nvl(a.status_andamento,'PENDENTE') andamento,
                            nvl(e.ds_motivo,'Não informado') stopreason,
                            ROWNUM id,
                            a.cd_mao,
                            mo.ds_mao_obra,
                            ar.cd_area,
                            se.cd_secao,
                            ct.cd_centro,
                                                                    /*um.cd_unid_maq,*/
                            a.pode_parar_maq intervencao,
                            a.pode_esperar urgente,
                                                                    /*cc.codigo CentroCusto,*/
                            m.cd_famlia, --familia
                            a.date_when_closed,
                            a.data_programada planned_date,
                            b.hora_inicio hora_inicio_worker,
                            b.hora_fim hora_fim_worker,
                            CASE
                                    WHEN c.cadastro = '126024'
                                         AND b.hora_inicio IS NOT NULL
                                         AND b.hora_fim IS NULL THEN 0
                                    ELSE 1
                                END
                            showfirstinprogress,
                            b.id unit_of_work_id,
                            ts.tipo_servico
                        FROM
                                                                     /*( ( (*/
                            ( ( ( ( ( ( ( ( ( ( ( ( ( ( emer_comp a
                            LEFT OUTER JOIN comp_func_emer b ON a.numero = b.numero )
                            LEFT OUTER JOIN funcionario_sadege c ON b.cadastro = c.cadastro )
                            LEFT OUTER JOIN funcionario_sadege d ON a.cd_mantenedor = d.cadastro )
                            LEFT OUTER JOIN funcionario_sadege fs ON a.cd_solicitante = fs.cadastro )
                            LEFT OUTER JOIN motivo_ordem_parada e ON a.status_andamento_tipo = e.cd_motivo )
                            INNER JOIN componente_auxiliar g ON a.cd_componente = g.cd_compo )
                                                                    /*LEFT JOIN unid_maq um ON g.cd_unid_maq = um.cd_unid_maq)*/
                            INNER JOIN maquinas m ON g.cd_maquina = m.cd_maquina )
                                                                    /*LEFT OUTER JOIN unid_maq um ON g.cd_unid_maq = um.cd_unid_maq )*/
                                                                    /*LEFT OUTER JOIN centro_custos cc ON m.centro = cc.codigo )*/
                            INNER JOIN centro_trabalhos ct ON m.cd_centro = ct.cd_centro )
                            INNER JOIN secaos se ON ct.cd_secao = se.cd_secao )
                            INNER JOIN areas ar ON se.cd_area = ar.cd_area )
                            INNER JOIN fabricas f ON ar.cd_fabrica = f.cd_fabrica )
                            LEFT OUTER JOIN mao_obras mo ON a.cd_mao = mo.cd_mao_obra )
                            LEFT OUTER JOIN (
                                SELECT
                                    assessmentid,
                                    numero,
                                    accepted,
                                    reasonforrejection,
                                    assessmentvalueid,
                                    assessmentdate
                                FROM
                                    orderassessmentlog oal1
                                WHERE
                                    oal1.assessmentdate = (
                                        SELECT
                                            MAX(assessmentdate)
                                        FROM
                                            orderassessmentlog oal2
                                        WHERE
                                            oal1.numero = oal2.numero
                                    )
                            ) la ON la.numero = a.numero )
                            LEFT OUTER JOIN assessmentvalues av ON la.assessmentvalueid = av.assessmentvalueid )
                            LEFT OUTER JOIN tipo_servs ts ON a.cd_tipo = ts.cd_tipo
                        WHERE
                            (
                                (
                                    f.cd_fabrica = '07'
                                    OR    '07' IS NULL
                                )
                                AND   (
                                    ar.cd_area = ''
                                    OR    '' IS NULL
                                )
                                AND   (
                                    se.cd_secao = ''
                                    OR    '' IS NULL
                                )
                                                /*AND (cd_secao = 'secaoVar' OR 'secaoVar' IS NULL)*/
                                                /*AND (cd_centro = 'centroTrabalhoVar' OR '' IS NULL)*/
                                                /*AND (centroCusto = 'centroCustoVar' OR '' IS NULL)*/
                                AND   (
                                    cd_famlia IN (
                                        ''
                                    )
                                    OR    '' IS NULL
                                )
                                AND   (
                                    g.cd_maquina = ''
                                    OR    '' IS NULL
                                )
                                                /*AND (cd_unid_maq = 'cd_unid_maqVar' OR '' IS NULL)*/
                                                /*AND (cd_componente = 'cd_componenteVar' OR '' IS NULL)*/
                                AND   (
                                    nvl(a.status_andamento,'PENDENTE') IN (
                                        'ALOCADO',
                                        'EMANDAMENTO',
                                        'PARADO',
                                        'PENDENTE'
                                    )
                                    OR    'ALOCADO,EMANDAMENTO,PARADO,PENDENTE' IS NULL
                                )
                                AND   (
                                    a.numero = ''
                                    OR    '' IS NULL
                                )
                                AND   (
                                    a.cd_atividade = ''
                                    OR    '' IS NULL
                                )
                                AND   (
                                    status = 'G'
                                    OR    'G' IS NULL
                                )
                                AND   (
                                    a.cd_tipo = ''
                                    OR    '' IS NULL
                                )
                                AND   (
                                    a.cd_mao IN (
                                        ''
                                    )
                                    OR    '' IS NULL
                                )
                                AND   (
                                    fs.cadastro = ''
                                    OR    '' IS NULL
                                )
                                AND   (
                                    c.cadastro = ''
                                    OR    cd_mantenedor = ''
                                    OR    '' IS NULL
                                ) 
                                                /*AND (intervencao = 'intervencaoVar' OR ''  IS NULL)*/
                                                /*AND (urgente = 'urgenteVar' OR ''  IS NULL)*/
                                AND   data_inicio <= TO_DATE('11/07/2019','dd/mm/YYYY')
                                AND   data_inicio >= TO_DATE('01/12/2017','dd/mm/YYYY')
                            )
                        ORDER BY
                            numero DESC
                    ) b
            ) a
        WHERE
            ROWNUM < ( ( 1 * 20 ) + 1 )
    )
WHERE
    r__ >= ( ( ( 1 - 1 ) * 20 ) + 1 )

This query was modified with the intent of also returning total number of distinct values of field 'numero'. And for that, the following line was added

COUNT(DISTINCT numero) OVER() total_orders

The modified query is shown below

SELECT
    *
FROM
    (
        SELECT
            a.*,
            ROWNUM r__
        FROM
            (
                SELECT
                    b.*,
                    COUNT(*) OVER() totalitems,
                    COUNT(DISTINCT numero) OVER() total_orders
                FROM
                    (
                        SELECT
                            0 isplanned,
                            1 tipo,
                            a.anexo,
                            la.accepted, --novo atende, não atende
                            av.assessmentvaluedescription, --otímo, bom, ruim, regular
                            a.cd_atividade,
                            a.cd_componente cd_componente,
                            a.cd_fabrica,
                            a.cd_tipo,
                            a.data_inicio data,
                            a.ds_equipamento maquina,
                            a.hora_inicio, --hora de abertura da ordem
                            a.maq_parada AS equipmentdown,
                            a.minuto_inicio, --minuto de abertura da ordem
                            a.numero numero,
                            a.obs, --descrição solicitação
                            a.recomendacao, --merge das observacoes dos funcionarios
                            la.reasonforrejection, --razão não aceite
                            a.solicitante solicitante, --nome solicitante
                            a.status status, --status 'B' ou 'G'
                            a.status_andamento_tipo_desc, --motivo parada
                            a.status_andamento_tipo, --código motivo status andamento parado
                            avaliacao_solicitante avaliacao_solicitante, --avaliação antiga
                            b.data_baixa_individual, --data em que manutentor fez serviço
                            b.hr_fim hora2, --hora fim manut
                            b.hr_ini hora1, --hora inicio manut
                            b.hr_total horatotal,
                            b.obs_func recomendacao3, --observação manutentor
                            c.cadastro cadastro, --código manutentor
                            c.nome nome, --manutentor
                            cd_mantenedor cd_mantenedor, --código manutentor alocado
                            d.nome ds_mantenedor, --funcionario alocado
                            f.ds_fabrica namefactory,
                            fs.cadastro cd_solicitante,
                            g.cd_maquina,
                            m.criticidade AS critical,
                            nvl(a.status_andamento,'PENDENTE') andamento,
                            nvl(e.ds_motivo,'Não informado') stopreason,
                            ROWNUM id,
                            a.cd_mao,
                            mo.ds_mao_obra,
                            ar.cd_area,
                            se.cd_secao,
                            ct.cd_centro,
                                                                    /*um.cd_unid_maq,*/
                            a.pode_parar_maq intervencao,
                            a.pode_esperar urgente,
                                                                    /*cc.codigo CentroCusto,*/
                            m.cd_famlia, --familia
                            a.date_when_closed,
                            a.data_programada planned_date,
                            b.hora_inicio hora_inicio_worker,
                            b.hora_fim hora_fim_worker,
                            CASE
                                    WHEN c.cadastro = '126024'
                                         AND b.hora_inicio IS NOT NULL
                                         AND b.hora_fim IS NULL THEN 0
                                    ELSE 1
                                END
                            showfirstinprogress,
                            b.id unit_of_work_id,
                            ts.tipo_servico
                        FROM
                                                                     /*( ( (*/
                            ( ( ( ( ( ( ( ( ( ( ( ( ( ( emer_comp a
                            LEFT OUTER JOIN comp_func_emer b ON a.numero = b.numero )
                            LEFT OUTER JOIN funcionario_sadege c ON b.cadastro = c.cadastro )
                            LEFT OUTER JOIN funcionario_sadege d ON a.cd_mantenedor = d.cadastro )
                            LEFT OUTER JOIN funcionario_sadege fs ON a.cd_solicitante = fs.cadastro )
                            LEFT OUTER JOIN motivo_ordem_parada e ON a.status_andamento_tipo = e.cd_motivo )
                            INNER JOIN componente_auxiliar g ON a.cd_componente = g.cd_compo )
                                                                    /*LEFT JOIN unid_maq um ON g.cd_unid_maq = um.cd_unid_maq)*/
                            INNER JOIN maquinas m ON g.cd_maquina = m.cd_maquina )
                                                                    /*LEFT OUTER JOIN unid_maq um ON g.cd_unid_maq = um.cd_unid_maq )*/
                                                                    /*LEFT OUTER JOIN centro_custos cc ON m.centro = cc.codigo )*/
                            INNER JOIN centro_trabalhos ct ON m.cd_centro = ct.cd_centro )
                            INNER JOIN secaos se ON ct.cd_secao = se.cd_secao )
                            INNER JOIN areas ar ON se.cd_area = ar.cd_area )
                            INNER JOIN fabricas f ON ar.cd_fabrica = f.cd_fabrica )
                            LEFT OUTER JOIN mao_obras mo ON a.cd_mao = mo.cd_mao_obra )
                            LEFT OUTER JOIN (
                                SELECT
                                    assessmentid,
                                    numero,
                                    accepted,
                                    reasonforrejection,
                                    assessmentvalueid,
                                    assessmentdate
                                FROM
                                    orderassessmentlog oal1
                                WHERE
                                    oal1.assessmentdate = (
                                        SELECT
                                            MAX(assessmentdate)
                                        FROM
                                            orderassessmentlog oal2
                                        WHERE
                                            oal1.numero = oal2.numero
                                    )
                            ) la ON la.numero = a.numero )
                            LEFT OUTER JOIN assessmentvalues av ON la.assessmentvalueid = av.assessmentvalueid )
                            LEFT OUTER JOIN tipo_servs ts ON a.cd_tipo = ts.cd_tipo
                        WHERE
                            (
                                (
                                    f.cd_fabrica = '07'
                                    OR    '07' IS NULL
                                )
                                AND   (
                                    ar.cd_area = ''
                                    OR    '' IS NULL
                                )
                                AND   (
                                    se.cd_secao = ''
                                    OR    '' IS NULL
                                )
                                                /*AND (cd_secao = 'secaoVar' OR 'secaoVar' IS NULL)*/
                                                /*AND (cd_centro = 'centroTrabalhoVar' OR '' IS NULL)*/
                                                /*AND (centroCusto = 'centroCustoVar' OR '' IS NULL)*/
                                AND   (
                                    cd_famlia IN (
                                        ''
                                    )
                                    OR    '' IS NULL
                                )
                                AND   (
                                    g.cd_maquina = ''
                                    OR    '' IS NULL
                                )
                                                /*AND (cd_unid_maq = 'cd_unid_maqVar' OR '' IS NULL)*/
                                                /*AND (cd_componente = 'cd_componenteVar' OR '' IS NULL)*/
                                AND   (
                                    nvl(a.status_andamento,'PENDENTE') IN (
                                        'ALOCADO',
                                        'EMANDAMENTO',
                                        'PARADO',
                                        'PENDENTE'
                                    )
                                    OR    'ALOCADO,EMANDAMENTO,PARADO,PENDENTE' IS NULL
                                )
                                AND   (
                                    a.numero = ''
                                    OR    '' IS NULL
                                )
                                AND   (
                                    a.cd_atividade = ''
                                    OR    '' IS NULL
                                )
                                AND   (
                                    status = 'G'
                                    OR    'G' IS NULL
                                )
                                AND   (
                                    a.cd_tipo = ''
                                    OR    '' IS NULL
                                )
                                AND   (
                                    a.cd_mao IN (
                                        ''
                                    )
                                    OR    '' IS NULL
                                )
                                AND   (
                                    fs.cadastro = ''
                                    OR    '' IS NULL
                                )
                                AND   (
                                    c.cadastro = ''
                                    OR    cd_mantenedor = ''
                                    OR    '' IS NULL
                                ) 
                                                /*AND (intervencao = 'intervencaoVar' OR ''  IS NULL)*/
                                                /*AND (urgente = 'urgenteVar' OR ''  IS NULL)*/
                                AND   data_inicio <= TO_DATE('11/07/2019','dd/mm/YYYY')
                                AND   data_inicio >= TO_DATE('01/12/2017','dd/mm/YYYY')
                            )
                        ORDER BY
                            numero DESC
                    ) b
            ) a
        WHERE
            ROWNUM < ( ( 1 * 20 ) + 1 )
    )
WHERE
    r__ >= ( ( ( 1 - 1 ) * 20 ) + 1 )

However this result set is not ordered by 'numero DESC'. For the first query, the result set is ordered by 'numero DESC'.

What should change in the second query to order by 'numero DESC' ?

  • 4
    You final query has no order by so Oracle is free to return the rows in any order it likes. An order by in a sub-query (derived table) is useless. The fact that the rows from the first query were returned in the order you expected was pure coincidence. – a_horse_with_no_name Jul 11 at 14:31

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.