簡體   English   中英

SQL 將多行的兩個查詢合二為一

[英]SQL merge two queries with multiple rows in one

我對一個視圖提出了兩個單獨的請求,每個結果都有幾行。 您可以看到結果的兩列之一是相同的。

我想知道如何合並這兩個查詢以獲得具有 3 列的單個表,即使某些結果是 NULL。 目的是將幾個結果分組以獲得一般的進度結果。

謝謝。

第一次查詢

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;

您可能正在尋找UNION ALL 更多信息在 Postgres 文檔中:

https://www.postgresql.org/docs/8.3/queries-union.html

請使用以下查詢,


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;

我認為您只是希望有兩個單獨的計數。 這種方法是最好的,因為您只掃描表一次。 我已將兩個查詢共有的條件移到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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM