2013-07-19 5 views
0

Как получить SUM полей в двух таблицах, у меня есть два стола, таблица laporan и laporan_pengeluaran.Как суммировать поля в двух таблицах и группах по дате

стол laporan

id shell date_created 
9 12000 2013-07-01 
10 24000 2013-07-01 
11 5500  2013-07-02 

стол laporan_pengeluaran

id laporan_id harga 
1 9   15000 
2 9   29000 
3 10   7500 
4 10   5000 

Мой вопрос, как получить SUM с присоединиться стол и группу в день, а соотношение laporan.id с laporan_pengeluaran .laporan_id. поэтому я хочу, чтобы получить результат, как показано ниже:

c_date_created c_shell c_harga 
2013-07-01  36000 44000 
2013-07-02  5500  12500 

Текущий мой запрос находится в ниже, но не Сукчес :-(, которые приводят к c_shell беспорядочного

SELECT 
    l.date_created as c_date_created 
    SUM(l.shell) as c_shell, 
    SUM(lp.harga) as c_harga, 
    l.* 
    FROM laporan l 
    LEFT JOIN laporan_pengeluaran lp ON l.id=lp.laporan_id 
    WHERE l.date_created BETWEEN '2013-07-01' AND '2013-07-05' 
    GROUP BY l.date_created 
    ORDER BY l.date_created ASC 

Благодаря

+0

Я думаю, что результаты вашего примера неверны для таблиц примеров. – Barmar

+0

Ваши результаты будут правы, если 'laporan_id' были 9, 10, 11, 11. – Barmar

ответ

1

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

SELECT l.date_created as c_date_created, 
SUM(l.shell) as c_shell, 
SUM(lp.c_harga) as c_harga, 
l.* 
FROM laporan l 
LEFT JOIN (SELECT laporan_id, 
        SUM(harga) as c_harga 
      FROM laporan_pengeluaran 
      GROUP BY laporan_id) as lp 
ON l.id = lp.laporan_id 
WHERE l.date_created BETWEEN '2013-07-01' AND '2013-07-05' 
GROUP BY l.date_created 
ORDER BY l.date_created ASC 
+0

Результат c_harga по-прежнему не в порядке sir, c_harga not SUM :-( –

+0

Исправлено. Еще один СУММ необходим во внешнем запросе. – Barmar

+0

Вы рок-н-ролл, спасибо .. Проблема решена. –

1

Проблема. вы сталкиваетесь с тем, что несколько строк в одной таблице соответствуют нескольким строкам во втором - поэтому вы получаете кросс-продукт для каждой даты.

Решение состоит в том, чтобы выполнить агрегацию перед выполнением объединения:

SELECT l.date_created as c_date_created 
     l.c_shell, 
     SUM(lp.harga) as c_harga, 
FROM (select l.date_created, l.shell as c_shell 
     from laporan l 
     WHERE l.date_created BETWEEN '2013-07-01' AND '2013-07-05' 
     group by l.date_created 
    ) l LEFT JOIN 
    laporan_pengeluaran lp 
    ON l.id=lp.laporan_id 
GROUP BY l.date_created 
ORDER BY l.date_created ASC; 

EDIT:

я вижу. join находится на id, а не на дату. Вышеупомянутое не будет работать, потому что id не во втором запросе. Вы должны суммировать каждый в подзапросе. Второй требует присоединения назад к другой таблице для того, чтобы получить дату:

SELECT l.date_created as c_date_created 
     l.c_shell, 
     lp.c_harga, 
FROM (select l.date_created, l.shell as c_shell 
     from laporan l 
     WHERE l.date_created BETWEEN '2013-07-01' AND '2013-07-05' 
     group by l.date_created 
    ) l LEFT JOIN 
    (select l.date_created, sum(lp.harga) as c_harga 
     from laporan l join 
      laporan_pengeluaran lp 
      on l.id=lp.laporan_id 
     group by l.date_created 
    ) lp 
    ON l.date_created = lp.date_created 
ORDER BY l.date_created ASC; 
+0

Привет, сэр, проблема связана с мистером Бармаром. Спасибо за вашу помощь, я даю вам большой палец. Еще раз спасибо. –