簡體   English   中英

如果在UNION ALL查詢中未找到任何行,則返回默認值

[英]Return a default value if no rows are found in UNION ALL query

腳本

我有一個從這個問題開發的查詢,優化的一部分是創建一個MySql視圖,用於為用戶和銷售生成統計信息,問題是當其中一個SELECT行沒有結果時,它從結果表。

如果沒有為任何SELECT找到行,如何告訴MySql設置默認值(例如0)?

這是用於創建視圖的代碼

CREATE OR REPLACE VIEW user_events AS
    SELECT 'Complete profiles' AS type, created_at
        FROM users
        WHERE completed_registration = 1

    UNION ALL SELECT 'Incomplete profiles', created_at
        FROM users
        WHERE completed_registration = 0 AND verified_email = 1

    UNION ALL SELECT 'Unverified profiles', created_at
        FROM users
        WHERE verified_email = 0

    UNION ALL SELECT 'Onsite Teachers', created_at
        FROM onsite_teachers

    UNION ALL SELECT 'Onsite Teachers hired', created_at
        FROM purchases
            INNER JOIN purchased_profiles
                ON purchased_profiles.purchase_id = purchases.id
                 AND purchased_profiles.profile_type = 'onsite_teacher'
        WHERE purchases.transaction_status = 'completed'

    UNION ALL SELECT 'Translators', created_at
        FROM translators

    UNION ALL SELECT 'Translators hired', created_at
        FROM purchases
            INNER JOIN purchased_profiles
                ON purchased_profiles.purchase_id = purchases.id
                AND purchased_profiles.profile_type = 'translator'
        WHERE purchases.transaction_status = 'completed'

    UNION ALL SELECT 'Interpreters', created_at
        FROM interpreters

    UNION ALL SELECT 'Interpreters hired', created_at
        FROM purchases
            INNER JOIN purchased_profiles
                ON purchased_profiles.purchase_id = purchases.id
                AND purchased_profiles.profile_type = 'interpreter'
        WHERE purchases.transaction_status = 'completed';

這是查詢過去6個月(包括當月)總計的代碼。

SELECT 
    type, 
    COUNT(CASE 
        WHEN created_at >= CAST(CURDATE() - INTERVAL (DAYOFMONTH(CURDATE()) - 1) DAY AS DATETIME) 
        THEN 1 
    END) AS 0_month_ago, 

    COUNT(CASE 
        WHEN created_at BETWEEN CAST(CURDATE() - INTERVAL (DAYOFMONTH(CURDATE()) - 1) DAY - INTERVAL 1 MONTH AS DATETIME)
            AND CAST(LAST_DAY(CURDATE() - INTERVAL 1 MONTH) + INTERVAL 1 DAY AS DATETIME)
        THEN 1 
    END) AS 1_month_ago,

    COUNT(CASE 
        WHEN created_at BETWEEN CAST(CURDATE() - INTERVAL (DAYOFMONTH(CURDATE()) - 1) DAY - INTERVAL 2 MONTH AS DATETIME)
            AND CAST(LAST_DAY(CURDATE() - INTERVAL 2 MONTH) + INTERVAL 1 DAY AS DATETIME)
        THEN 1 
    END) AS 2_months_ago,

    COUNT(CASE 
        WHEN created_at BETWEEN CAST(CURDATE() - INTERVAL (DAYOFMONTH(CURDATE()) - 1) DAY - INTERVAL 3 MONTH AS DATETIME)
            AND CAST(LAST_DAY(CURDATE() - INTERVAL 3 MONTH) + INTERVAL 1 DAY AS DATETIME)
        THEN 1 
    END) AS 3_months_ago,

    COUNT(CASE 
        WHEN created_at BETWEEN CAST(CURDATE() - INTERVAL (DAYOFMONTH(CURDATE()) - 1) DAY - INTERVAL 4 MONTH AS DATETIME)
            AND CAST(LAST_DAY(CURDATE() - INTERVAL 4 MONTH) + INTERVAL 1 DAY AS DATETIME)
        THEN 1 
    END) AS 4_months_ago,

    COUNT(CASE 
        WHEN created_at BETWEEN CAST(CURDATE() - INTERVAL (DAYOFMONTH(CURDATE()) - 1) DAY - INTERVAL 5 MONTH AS DATETIME)
            AND CAST(LAST_DAY(CURDATE() - INTERVAL 5 MONTH) + INTERVAL 1 DAY AS DATETIME)
        THEN 1 
    END) AS 5_months_ago
FROM 
    user_events
GROUP BY 
    type;

電流輸出

如果你仔細觀察,沒有Interpreters hiredTranslators hired行,我想要設置這些行,如果它們返回null則歸零

+=========================+===============+===============+===============+==============+===============+===============+
|          type           |  0_month_ago  |  1_month_ago  |  2_month_ago  | 3_month_ago  |  4_month_ago  |  5_month_ago  |
+=========================+===============+===============+===============+==============+===============+===============+
|    Complete profiles    |       7       |      20       |      14       |      25      |      30       |       7       |
+-------------------------+---------------+---------------+---------------+--------------+---------------+---------------+
|   Incomplete profiles   |      12       |      27       |      56       |      45      |      48       |      23       |
+-------------------------+---------------+---------------+---------------+--------------+---------------+---------------+
|   Unverified profiles   |       3       |      16       |      23       |       5      |       0       |       9       |
+-------------------------+---------------+---------------+---------------+--------------+---------------+---------------+
|    Onsite Teachers      |      11       |      36       |       8       |      15      |      46       |      12       |
+-------------------------+---------------+---------------+---------------+--------------+---------------+---------------+
|  Onsite Teachers hired  |       0       |       0       |      12       |       9      |       3       |       0       |
+-------------------------+---------------+---------------+---------------+--------------+---------------+---------------+
|      Interpreters       |       4       |      21       |      27       |      46      |      45       |      28       |
+-------------------------+---------------+---------------+---------------+--------------+---------------+---------------+
|      Translators        |       7       |      20       |      19       |      27      |      19       |      42       |
+-------------------------+---------------+---------------+---------------+--------------+---------------+---------------+

user_events視圖是一種日志,看起來像

type                  | created_at
======================+==============
Interpreters hired    | 2014-12-12
Interpreters hired    | 2014-12-14
Interpreters hired    | 2014-12-16
Interpreters hired    | 2015-01-02

但是,如果沒有雇用過口譯員,那么就不會有type = 'Interpreters hired' 在這種情況下,計數查詢無法憑空創建一個Interpreters hired行。

解決方案是確保在user_events視圖中出現Interpreters hired行,無論如何。 您可以創建沒有created_at日期的虛構行。 這樣, GROUP BY總會有一些東西,但不一定是COUNT()

CREATE OR REPLACE VIEW user_events AS
    SELECT 'Complete profiles' AS type, created_at
        FROM users
        WHERE completed_registration = 1

    UNION ALL SELECT 'Incomplete profiles', created_at
        FROM users
        WHERE completed_registration = 0 AND verified_email = 1

    UNION ALL SELECT 'Unverified profiles', created_at
        FROM users
        WHERE verified_email = 0

    UNION ALL SELECT 'Onsite Teachers', created_at
        FROM onsite_teachers

    UNION ALL SELECT 'Onsite Teachers hired', created_at
        FROM purchases
            INNER JOIN purchased_profiles
                ON purchased_profiles.purchase_id = purchases.id
                 AND purchased_profiles.profile_type = 'onsite_teacher'
        WHERE purchases.transaction_status = 'completed'
    UNION ALL SELECT 'Onsite Teachers hired', NULL

    UNION ALL SELECT 'Translators', created_at
        FROM translators

    UNION ALL SELECT 'Translators hired', created_at
        FROM purchases
            INNER JOIN purchased_profiles
                ON purchased_profiles.purchase_id = purchases.id
                AND purchased_profiles.profile_type = 'translator'
        WHERE purchases.transaction_status = 'completed'
    UNION ALL SELECT 'Translators hired', NULL

    UNION ALL SELECT 'Interpreters', created_at
        FROM interpreters

    UNION ALL SELECT 'Interpreters hired', created_at
        FROM purchases
            INNER JOIN purchased_profiles
                ON purchased_profiles.purchase_id = purchases.id
                AND purchased_profiles.profile_type = 'interpreter'
        WHERE purchases.transaction_status = 'completed'
    UNION ALL SELECT 'Interpreters hired', NULL;

暫無
暫無

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

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