Общее количество от нескольких таблиц - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть таблица списка, которая в основном содержит одно и то же поле в каждой части.

- p_ticket1_m_site_data   |  - p_ticket1_ticket  |  - p_ticket1_last_row
- p_ticket2_m_site_data   |  - p_ticket2_ticket  |  - p_ticket2_last_row
- p_ticket3_m_site_data   |  - p_ticket3_ticket  |  - p_ticket3_last_row

Я могу подсчитать каждую таблицу отдельно:

SELECT COUNT( * ) AS tot_sites, IFNULL( COUNT( 
            CASE WHEN p_ticket1_m_site_data.m_date_target = DATE( NOW( ) ) 
            THEN 1 
            ELSE NULL 
            END ),0) AS todays_target, IFNULL( COUNT( 
            CASE WHEN (
            p_ticket1_m_site_data.m_date_target = DATE( NOW( ) ) 
            AND p_ticket1_ticket.t_status =9 ) 
            THEN 1 
            ELSE NULL 
            END ),0
            ) AS todays_achieve, IFNULL( COUNT( 
            CASE WHEN p_ticket1_ticket.t_status =9
            THEN 1 
            ELSE NULL 
            END ),0 ) AS tot_in
            FROM p_ticket1_m_site_data
            LEFT JOIN p_ticket1_last_row ON p_ticket1_last_row.t_m_id = p_ticket1_m_site_data.m_id
            AND p_ticket1_last_row.t_req_type = '04_int_finish_ack'
            LEFT JOIN p_ticket1_ticket ON p_ticket1_ticket.t_id = p_ticket1_last_row.t_id
            WHERE p_ticket1_m_site_data.m_status =1

enter image description here

Что мне делать, если я хочу подсчитать все общее количество сайтов из ticket1, ticket2, ticket3?

Пожалуйста, помогите мне, ребята, спасибо.,.

Пример использования UNION ALL:

enter image description here

Я просто использую UNION ALL в своем коде выше для ticket1 и ticket2, но это не такчто я хочу.Мой вывод ожидания подсчитать все таблицы тикетов, так что представление: tot_sites (из всех тикетов), todays_target (из всех тикетов), todays_achieve (из всех тикетов) и tot_in (из всех тикетов)

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Вы можете объединить три набора таблиц в подзапросе, а затем выполнить подсчет в основном запросе, что-то вроде этого в основном

SELECT COUNT( * ) AS tot_sites, IFNULL( COUNT( 
            CASE WHEN m_date_target = DATE( NOW( ) ) 
             THEN 1 
            ELSE NULL 
            END ),0) AS todays_target, IFNULL( COUNT( 
            CASE WHEN (m_date_target = DATE( NOW( ) ) 
            AND t_status =9 ) 
             THEN 1 
            ELSE NULL 
            END ),0
            ) AS todays_achieve, IFNULL( COUNT( 
            CASE WHEN t_status =9
             THEN 1 
            ELSE NULL 
            END ),0 ) AS tot_in
from
(
select * 
FROM p_ticket1_m_site_data
LEFT JOIN p_ticket1_last_row ON p_ticket1_last_row.t_m_id = p_ticket1_m_site_data.m_id
     AND p_ticket1_last_row.t_req_type = '04_int_finish_ack'
LEFT JOIN p_ticket1_ticket ON p_ticket1_ticket.t_id = p_ticket1_last_row.t_id
WHERE p_ticket1_m_site_data.m_status =1
union all
select * 
frOM p_ticket2_m_site_data
LEFT JOIN p_ticket2_last_row ON p_ticket2_last_row.t_m_id = p_ticket2_m_site_data.m_id
AND p_ticket2_last_row.t_req_type = '04_int_finish_ack'
LEFT JOIN p_ticket2_ticket ON p_ticket2_ticket.t_id = p_ticket2_last_row.t_id
WHERE p_ticket2_m_site_data.m_status =1
union all
select * 
fROM p_ticket3_m_site_data
LEFT JOIN p_ticket3_last_row ON p_ticket3_last_row.t_m_id = p_ticket3_m_site_data.m_id
AND p_ticket3_last_row.t_req_type = '04_int_finish_ack'
LEFT JOIN p_ticket3_ticket ON p_ticket3_ticket.t_id = p_ticket3_last_row.t_id
WHERE p_ticket3_m_site_data.m_status =1
) j;

, которое можно привести в порядок.Если это не работает для вас, пожалуйста, добавьте примерные данные и ожидаемый результат для ваших 3 таблиц в виде текста к вопросу, и я рассмотрю.

0 голосов
/ 04 февраля 2019

Если вы уверены, что ваши таблицы имеют одинаковые столбцы, вам следует использовать UNION ALL с CTE

WITH CTE AS (

SELECT *
FROM p_ticket1_m_site_data
UNION ALL 
SELECT *
FROM p_ticket2_m_site_data
UNION ALL
...

)
SELECT COUNT(*), ...
FROM CTE
WHERE CTE.m_status = 1

CTE UNION ALL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...