2015-04-11 2 views
2

Запросить сумму в двух таблицахЗапрос двух таблиц

У меня есть таблица транзакций и таблица платежей. Мне нужно получить общую сумму как в таблице Trans, так и в таблице платежей, и она должна быть группой TransID. Я надеюсь, что кто-то может помочь мне с правильным заявлением sql для этого.

Я попробовал sql ниже, но сумма суммы на Trans Table будет умножена на количество записей одного и того же TransID в таблице Payment.

-> Select Trans.TransID, sum(Trans.Amount), sum(Payment.Amount) 
    from Trans 
    Left Join Payment on Payment.TransID = Trans.TransID 

Я также пробовал sql ниже, но время обработки больше по сравнению с заявлением sql выше.

-> Select TD.TransID, TD.Amt, PD.paid 
    from 
    (
     Select Trans.TransID, Sum(Trans.Amount) AS Amt 
     from Trans Group By Trans.TransID 
    ) AS TD 
    Left Join 
    (
     Select Payment.TransID, sum(Payment.Amount) AS Paid 
     from payment 
     Group by Payment.TransID 
    ) AS PD On PD.TransID = TD.TransID 

Транс Таблица

TransID | Amount 
T1  | 10  
T2  | 15  
T3  | 12  
T4  | 20  
T5  | 11  
T1  | 15  
T5  | 14 


---------- 

Оплата Таблица

TransID | Amount  
T1  | 5  
T3  | 10   
T1  | 3  
T2  | 5  
T5  | 10 


---------- 

Результат запроса мне нужно, как предполагается, должен быть таким образом:

TransID | Amount | Paid  
T1  | 25  | 8  
T2  | 15  | 5  
T3  | 12  | 10  
T4  | 20  | 0 
T5  | 25  | 10 

ответ

1

Вы можете использовать два различных запросов , который суммирует все суммы (и устанавливает об оплачиваемых столбец 0) и один, который суммирует все значения Paid (и устанавливает столбец Amount на 0) и объединить с помощью UNION ALL запрос, и просуммировать результаты:

SELECT TransID, SUM(Amount) AS Amount, SUM(Paid) AS Paid 
FROM (
    SELECT TransID, SUM(Amount) AS Amount, 0 AS Paid 
    FROM Trans 
    GROUP BY TransID 
    UNION ALL 
    SELECT TransID, 0 AS Amount, SUM(Amount) AS Paid 
    FROM Payment 
    GROUP BY TransID 
) s 
GROUP BY TransID 

Пожалуйста, смотрите скрипку here.

+0

Я пробовал это, но он дает сообщение об ошибке Неизвестный столбец 'TransID' в 'списке полей' –

+0

@CarloUyMatiao Я думаю, что мой ответ в порядке, вы, вероятно, получаете эту ошибку в ответ Гордона, он просто набросал псевдоним, Я собираюсь отредактировать его ответ – fthiella

0

С точкой зрения времени обработки, нижеследующий может быть быстрым, если у вас есть индекс на `Payment (ТрансИд, сумма)

SELECT t.TransId, t.Amount, 
     (SELECT SUM(p.Amount) 
     FROM Payment p 
     WHERE p.TransId = t.TransId 
     ) as Paid 
FROM (SELECT t.TransID, SUM(t.Amount) AS Amount 
     FROM Trans t 
     GROUP BY t.TransID 
    ) t; 

MySQL будет использовать индекс для коррелированных подзапросов, которые должен быть быстрее, чем три group by запросов.

+0

Спасибо за код sql. Время обработки все еще медленное, но это пока что самое быстрое. Я надеюсь, что есть еще один код, который имеет более быстрое время обработки. –

Смежные вопросы