sql在一个查询中合并两个具有多行的查询

2sbarzqh  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(260)

我对一个视图提出了两个独立的请求,每个结果都有几行。您可以看到结果的两列中有一列是相同的。
我想知道如何合并这两个查询以获得一个包含3列的表,即使有些结果是空的。其目的是将若干结果分组,以获得总体进展结果。
谢谢。
第一个查询

SELECT appui.pa, COUNT(appui.gid) AS appui_non_lance

FROM genie_civil.v_appui appui

JOIN suivi.v_contour_aerien aer ON aer.id = appui.contour_etude

WHERE num_appui LIKE 'E%'

AND etat_appui != 'Non utilisé'

AND type_travaux != 'artère neuve'

AND avancement_etude_app = 'non renseigné'

AND date_envoi_pv IS NULL

AND date_retour_pv IS NULL

AND etat_pv = '--Non Renseigné--'

AND aer.date_depot_erdf IS NULL

AND aer.etat_etude_erdf = 'NC'

AND aer.etat_affaire IS NULL

AND date_com IS NULL

AND valid_com IS NULL

--AND date_envoi_executant_app IS NULL

AND date_retour_tvx_appui IS NULL

AND aer.etat_aat = '--Non renseigné--'

AND date_tfx IS NULL

AND valid_tfx IS NULL

AND aer.date_envoi_d2 IS NULL

GROUP BY appui.pa;

第二个查询

SELECT appui.pa, COUNT(appui.gid) AS appui_en_releve

FROM genie_civil.v_appui appui

JOIN suivi.v_contour_aerien aer ON aer.id = appui.contour_etude

WHERE num_appui LIKE 'E%'

AND etat_appui != 'Non utilisé'

AND avancement_etude_app IN('à relever', 'en cours relevé', 'à contrôler relevé')

AND date_envoi_pv IS NULL

AND date_retour_pv IS NULL

AND etat_pv = '--Non Renseigné--'

AND date_com IS NULL

AND valid_com IS NULL

--AND date_envoi_executant_app IS NULL

AND date_retour_tvx_appui IS NULL

AND aer.date_depot_erdf IS NULL

AND aer.etat_etude_erdf ='NC'

AND aer.etat_affaire IS NULL

AND aer.etat_aat = '--Non renseigné--'

AND date_tfx IS NULL

AND valid_tfx IS NULL

AND aer.date_envoi_d2 IS NULL

GROUP BY appui.pa;
mdfafbf1

mdfafbf11#

你可能在找 UNION ALL . 更多信息请参见postgres文档:
https://www.postgresql.org/docs/8.3/queries-union.html

zpjtge22

zpjtge222#

请使用下面的查询,

SELECT appui.pa, COUNT(appui.gid) AS appui_non_lance 
FROM genie_civil.v_appui appui
JOIN suivi.v_contour_aerien aer ON aer.id = appui.contour_etude
WHERE num_appui LIKE 'E%'
AND etat_appui != 'Non utilisé' AND type_travaux != 'artère neuve' AND avancement_etude_app = 'non renseigné'
AND date_envoi_pv IS NULL AND date_retour_pv IS NULL AND etat_pv = '--Non Renseigné--'
AND aer.date_depot_erdf IS NULL AND aer.etat_etude_erdf = 'NC' AND aer.etat_affaire IS NULL
AND date_com IS NULL AND valid_com IS NULL
--AND date_envoi_executant_app IS NULL
AND date_retour_tvx_appui IS NULL AND aer.etat_aat = '--Non renseigné--' AND date_tfx IS NULL
AND valid_tfx IS NULL AND aer.date_envoi_d2 IS NULL 
GROUP BY appui.pa

UNION ALL

SELECT appui.pa, COUNT(appui.gid) AS appui_en_releve FROM genie_civil.v_appui appui
JOIN suivi.v_contour_aerien aer ON aer.id = appui.contour_etude
WHERE num_appui LIKE 'E%' 
AND etat_appui != 'Non utilisé' AND avancement_etude_app IN('à relever', 'en cours relevé', 'à contrôler relevé')
AND date_envoi_pv IS NULL AND date_retour_pv IS NULL AND etat_pv = '--Non Renseigné--' AND date_com IS NULL
AND valid_com IS NULL 
--AND date_envoi_executant_app IS NULL
AND date_retour_tvx_appui IS NULL AND aer.date_depot_erdf IS NULL AND aer.etat_etude_erdf ='NC'
AND aer.etat_affaire IS NULL AND aer.etat_aat = '--Non renseigné--'  AND date_tfx IS NULL 
AND valid_tfx IS NULL AND aer.date_envoi_d2 IS NULL
GROUP BY appui.pa;
4nkexdtk

4nkexdtk3#

我想你只是在找两个不同的罪名。这种方法最好,因为您只扫描表一次。我已经将两个查询的共同条件移到 where 条款,而其他条款是各自条款的一部分 case 表达。

SELECT appui.pa,
    COUNT(CASE WHEN
            type_travaux != 'artère neuve'
        AND avancement_etude_app = 'non renseigné'
        AND aer.date_depot_erdf IS NULL
        AND aer.etat_etude_erdf = 'NC'
    THEN 1 END) AS appui_non_lance,
    COUNT(CASE WHEN
            etat_appui != 'Non utilisé'
        AND avancement_etude_app IN ('à relever', 'en cours relevé', 'à contrôler relevé')
    THEN 1 END) AS appui_en_releve
FROM genie_civil.v_appui appui INNER JOIN suivi.v_contour_aerien aer
    ON aer.id = appui.contour_etude
WHERE
        num_appui LIKE 'E%'
    AND etat_appui != 'Non utilisé'
    AND etat_pv = '--Non Renseigné--'
    AND date_envoi_pv IS NULL
    AND date_retour_pv IS NULL
    AND aer.etat_affaire IS NULL
    AND date_com IS NULL
    AND valid_com IS NULL
    --AND date_envoi_executant_app IS NULL
    AND aer.etat_aat = '--Non renseigné--'
    AND date_tfx IS NULL
    AND date_retour_tvx_appui IS NULL
    AND valid_tfx IS NULL
    AND aer.date_envoi_d2 IS NULL
GROUP BY appui.pa;

相关问题