【问题标题】:Missing data from one table when LEFT JOINLEFT JOIN 时缺少一张表中的数据
【发布时间】:2020-04-03 22:17:00
【问题描述】:

我想加入下面的表格,因为某些表格中有空天,我生成了包含所有日期的日期并使用 DISTINCT ON 来消除结果中的重复行。

我加入了他们的日期和用户。 (一般还有其他用户,我只是加了一个。)

请注意,每个表都是在不同的 CTE 中创建的。我只包含了生成的日期和查询的连接部分。

我的查询中唯一的问题是,它没有给我“潜在客户”表中的所有数据。 如何获取每个表中的所有数据?

    WITH dates AS (SELECT d::DATE AS DATE FROM GENERATE_SERIES('2018-01-01', CURRENT_DATE, '1 day'::INTERVAL) d )

        SELECT DISTINCT ON (dates.date) dates.date,
        calls.user,
        leads.leads_total,
        calls.calls_total,
        deals.deals_total,
        cases.cases_total
    FROM dates
    LEFT JOIN calls ON
    calls.call_date = dates.date
    LEFT JOIN leads ON
    leads.leads_date = dates.date
    AND calls.user = leads.user
    LEFT JOIN cases ON
    cases.case_date= dates.date
    AND calls.user = cases.user  
    LEFT JOIN deals ON
    deals.deals_date = dates.date
    AND calls.user = deals.user
    WHERE
        dates.date >= '2019-11-01'
        AND dates.date <= '2019-11-10'
    GROUP BY
        dates.date calls.owner_name,
        leads.leads_total,
        calls.calls_total,
        deals.deals_total,
        cases.cases_total
    ORDER BY
        dates.date DESC

潜在客户表:

+------------+-----------+-------------+
| leads_date |   user    | leads_total |
+------------+-----------+-------------+
| 11/9/2019  | James Joe |           4 |
| 11/8/2019  | James Joe |          10 |
| 11/7/2019  | James Joe |           7 |
| 11/6/2019  | James Joe |          12 |
| 11/5/2019  | James Joe |           8 |
| 11/4/2019  | James Joe |           8 |
| 11/2/2019  | James Joe |           2 |
| 11/1/2019  | James Joe |           4 |
+------------+-----------+-------------+

来电表:

+-----------+-----------+-------------+
| call_date |   user    | calls_total |
+-----------+-----------+-------------+
| 11/8/2019 | James Joe |          47 |
| 11/7/2019 | James Joe |          55 |
| 11/6/2019 | James Joe |          52 |
| 11/5/2019 | James Joe |          54 |
| 11/4/2019 | James Joe |          48 |
| 11/1/2019 | James Joe |          51 |
+-----------+-----------+-------------+

交易表:

+------------+-----------+-------------+
| deals_date |   user    | deals_total |
+------------+-----------+-------------+
| 11/8/2019  | James Joe |           1 |
| 11/7/2019  | James Joe |           1 |
| 11/6/2019  | James Joe |           3 |
| 11/4/2019  | James Joe |          16 |
| 11/1/2019  | James Joe |           1 |
+------------+-----------+-------------+

病例表:

+-----------+-----------+-------------+
| case_date |   user    | cases_total |
+-----------+-----------+-------------+
| 11/8/2019 | James Joe |           5 |
| 11/7/2019 | James Joe |           4 |
| 11/6/2019 | James Joe |          12 |
| 11/4/2019 | James Joe |           5 |
| 11/1/2019 | James Joe |           2 |
+-----------+-----------+-------------+

期望的输出:

【问题讨论】:

    标签: sql postgresql join duplicates left-join


    【解决方案1】:

    您正在 calls.user 上加入 leads

    LEFT JOIN leads ON
        leads.leads_date = dates.date
        AND calls.user = leads.user
    

    由于 calls 包含 6 行,因此在此联接中仅丢弃了一些 lead 数据。

    建议的解决方案

    提取所有用户和CROSS JOIN 以及日期。然后,您将获得每个日期/用户组合的一行。

    WITH
        dates AS (
            SELECT
                d::DATE AS date
            FROM
                GENERATE_SERIES('2018-01-01', CURRENT_DATE, '1 day'::INTERVAL) d
        ),
        users AS (
            SELECT "user" FROM leads
            UNION SELECT "user" FROM calls
            UNION SELECT "user" FROM deals
            UNION SELECT "user" FROM cases
        )
        SELECT 
            dates.date,
            users.user,
            leads.leads_total,
            calls.calls_total,
            deals.deals_total,
            cases.cases_total
        FROM
            dates
            CROSS JOIN users
            LEFT OUTER JOIN leads ON leads.leads_date = dates.date AND leads.user = users.user
            LEFT OUTER JOIN calls ON calls.call_date = dates.date AND calls.user = users.user
            LEFT OUTER JOIN deals ON deals.deals_date = dates.date AND deals.user = users.user
            LEFT OUTER JOIN cases ON cases.case_date = dates.date AND cases.user = users.user
        WHERE
            dates.date >= '2019-11-01'
            AND dates.date <= '2019-11-10'
        ORDER BY
            users.user,
            dates.date DESC
    

    【讨论】:

    • 我需要在结果表中有一个用户名,所以我在SELECT语句中包含了calls.user。我应该怎么做才能从每个表中获取所有数据?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    相关资源
    最近更新 更多