Соединение 4 таблиц, приводящих к пустому результату - PullRequest
4 голосов
/ 24 апреля 2019

У меня по 4 таблицы с этими подробностями на каждой таблице

Таблица deli_order

order_code | code | plat_create_time | status
OC001        C001   2019-04-14    Success
OC002        C002   2019-04-14    Success
OC003        C003   2019-04-14    Success

pg_order Таблица

id |order_code | code | plat_create_time
1    OC001       C001   2019-04-14
2    OC002       C002   2019-04-14
3    OC003       C003   2019-04-14

Таблица pg_package

pg_order_id | plat_create_time | cm_sign_time
1                2019-04-14         2019-04-14
2                2019-04-14         2019-04-14
3                2019-04-14             -

Таблица pg_send_package

order_code | code | plat_create_time | lp_sign_time
OC001        C001   2019-04-14             -
OC002        C002   2019-04-14             -
OC003        C003   2019-04-14         2019-04-14

Мне нужно подсчитать данные транзакции, которые имеют 'cm_sign_time' или'lp_sign_time.Таблицу pg_package нужно сначала соединить с pg_order, после этого ее можно соединить с таблицей deli_order.

Сначала я пытаюсь сначала соединить таблицу pg_send_package с таблицей deli_order.Это мой запрос

SELECT 
    DATE(A.create_time) AS 'Create Time',
    SUM(CASE
        WHEN B.lp_sign_time IS NOT NULL THEN 1
        ELSE 0
    END) AS 'Completed Order'
FROM
    deli_order A
INNER JOIN pg_send_package B ON B.order_code = A.order_code AND B.code = A.code
WHERE DATE(A.plat_create_time) = '2019-04-14'
GROUP BY DATE(A.plat_create_time);

и результат

Create Time | Completed Order
2019-04-14     130

Но когда я присоединяюсь к двум другим таблицам, полученный результат - ничто.Это мой запрос

SELECT 
    DATE(A.plat_create_time) AS 'Create Time',
    SUM(CASE
        WHEN B.lp_sign_time IS NOT NULL THEN 1
        WHEN D.cm_sign_time IS NOT NULL THEN 1
        ELSE 0
    END) AS 'Completed Order'
FROM
    deli_order A
INNER JOIN pg_send_package B ON B.order_code = A.order_code AND B.code = A.code
INNER JOIN pg_order C ON C.order_code = A.order_code AND C.oms_code = A.code
INNER JOIN pg_package D ON D.pg_order_id = C.id
WHERE
    DATE(A.plat_create_time) = '2019-04-14'
GROUP BY DATE(A.plat_create_time);

Это результат

Create Time | Completed Order

Мне нужно суммировать результат подсчета транзакции, в которой есть 'lp_sign_time' или 'cm_sign_time'.

Мой ожидаемый результат:

Create Time | Completed Order
2019-04-14        150

150 получен из 130 транзакций с 'lp_sign_time' и 20 транзакций с 'cm_sign_time' Что я должен изменить в своем запросе?

1 Ответ

1 голос
/ 24 апреля 2019

Вы можете попробовать использовать UNION ALL объединить таблицы pg_send_package и pg_package, сделать результирующий набор для order_code,code,lp_sign_time, затем сделать OUTER JOIN с COUNT.

SELECT DATE(A.plat_create_time) AS 'Create Time', 
       COUNT(lp_sign_time) AS 'Completed Order'
FROM deli_order A
LEFT JOIN
(
    SELECT order_code, 
           code, 
           lp_sign_time
    FROM pg_send_package psp
    UNION ALL
    SELECT C.order_code, 
           C.code, 
           pp.cm_sign_time
    FROM pg_package pp
         INNER JOIN pg_order C ON pp.pg_order_id = C.id
) t1 ON t1.order_code = A.order_code
        AND t1.code = A.code
        AND DATE(A.plat_create_time) = '2019-04-14'
GROUP BY DATE(A.plat_create_time);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...