2013-07-19 48 views
0

如何在两个表中获得SUM字段,我有两个表,我的表是laporanlaporan_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 

我的问题,如何获得与天连接表和组之和,关系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仍然是错误的先生,c_harga不是SUM :-( –

+0

修复它。在外部查询中需要另一个SUM。 – Barmar

+0

您是摇滚先生,谢谢..问题已解决.. Yeaahhhh !!! –

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; 

编辑:

我明白了。 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

你好,先生,问题与Barmar先生一起解决。感谢您的帮助,我给你大拇指。再次感谢。 –

相关问题