2016-09-01 4 views
1

У меня есть три таблицыMYSQL выберите присоединиться несколько таблицу и SUM

1.master

id_master barcode name last_stock 
1   123  abc 15 
2   234  bcd 10 
3   345  cde 7 
4   456  def 11 
5   567  efg 20 

2. trans_in

id_trans_in barcode qty time_trans 
1   567  1 2016-04-01 10:15:09 
2   234  2 2016-04-01 14:15:09 
3   345  5 2016-04-01 20:15:09 

3. trans_out

id_trans_out barcode qty time_trans 
1   123  3 2016-04-01 09:15:09 
2   234  5 2016-04-01 08:15:09 

Я должен построить запрос, чтобы дать результат

id_master barcode name last_stock in out 
1   123  abc 15   0 3 
2   234  bcd 10   2 5 
3   345  cde 7   5 0 
4   456  def 11   0 0 
5   567  efg 20   1 0 

Я просто пытался простой запрос

select 
    a.id_master, a.barcode, a.name, 
    COALESCE(SUM(b.qty),'0') 
from 
    master a 
inner join trans_in b 
on a.barcode = b.barcode 
where 
    date(b.time_trans) = '2016-04-01' 
group by a.barcode 

результат

id_master barcode name COALESCE(SUM(b.qty),'0') 
5   567  efg 1 
2   234  bcd 2 
3   345  cde 5 

я не знаю, как совместить полный список мастер, trans_in и trans_out по time_trans (если нуль, то 0), я уже пытаюсь использовать левое соединение, внутреннее соединение на трех из них, но результат заставляет меня головокружение .. результат из SUM больше, чем qty из поля, я действительно не знаю, почему.

ответ

0

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

SELECT a.id_master , 
     a.barcode , 
     a.name , 
     a.last_stock , 
     COALESCE(b.`IN`, 0) AS `IN`, 
     COALESCE(c.`OUT`, 0) AS `OUT` 
FROM master a 
     LEFT JOIN (SELECT barcode, SUM(qty) as `IN` 
        FROM trans_in 
        WHERE date(time_trans) = '2016-04-01' 
        GROUP BY barcode) b ON a.barcode = b.barcode 
     LEFT JOIN (SELECT barcode, SUM(qty) as `OUT` 
        FROM trans_out 
        WHERE date(time_trans) = '2016-04-01' 
        GROUP BY barcode) c ON a.barcode = c.barcode; 
+0

Получение синтаксиса ошибок, я помещаю одиночную кавычку в каждый как ('in', 'out'), удаляю запятую после выхода, но все равно получаю синтаксис ошибок в другой строке «неизвестный b.barcode in on». –

+0

dang .. извините .. нужно включить штрих-код в ваши производные таблицы .. я буду обновлять – JamieD77

+0

работать как шарм bro ... действительно гладкий запрос ... спасибо снова, мой брат ..: D –

0

т.д .:

SELECT m.* 
    , COALESCE(SUM(CASE WHEN type = 'trans_in' THEN qty END),0) `in` 
    , COALESCE(SUM(CASE WHEN type = 'trans_out' THEN qty END),0) `out` 
    FROM master m 
    LEFT 
    JOIN 
    (SELECT 'trans_in' type 
      , id_trans_in id_trans 
      , barcode 
      , qty 
      , time_trans 
     FROM trans_in 
     WHERE time_trans BETWEEN '2016-04-01 00:00:00' AND '2016-04-01 23:23:59' 
     UNION ALL 
     SELECT 'trans_out' 
      , id_trans_out 
      , barcode 
      , qty,time_trans 
     FROM trans_out 
     WHERE time_trans BETWEEN '2016-04-01 00:00:00' AND '2016-04-01 23:23:59' 
    ) x 
    ON x.barcode = m.barcode 
GROUP 
    BY m.id_master 
ORDER 
    BY id_master; 

Рассматривают хранения транзакций в одной таблице. Это упростит и ускорит этот процесс. Кроме того, я принял индекс INDEX на time_trans и построил соответствующий запрос диапазона.

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