2015-12-29 55 views
0

我有两个表,我需要连接并获得每个表中一列的SUM()。从两个表连接两列的MySQL SUM()

mysql> select * from day_sales2; 
    +--------+------------+ 
    | id  | ds_oversht | 
    +--------+------------+ 
    | 119263 |  -0.17 | 
    | 119336 |  0.55 | 
    | 119409 |  3.08 | 
    | 119482 |  -33.25 | 
    | 119555 |  1.27 | 
    | 119628 |  0.32 | 
    | 119701 |  -0.15 | 
    | 119774 |  6.57 | 
    | 119847 |  -0.06 | 
    | 119920 |  -12.04 | 
    | 119993 |  -12.40 | 
    | 120066 |  -38.90 | 
    | 120139 |  20.56 | 
    | 120212 |  -17.11 | 
    | 120285 |  -0.51 | 
    | 120358 |  0.04 | 
    | 120431 |  3.23 | 
    | 120504 |  -0.89 | 
    | 120577 |  2.13 | 
    | 120650 |  0.57 | 
    | 120723 |  -1.15 | 
    | 120796 |  1.99 | 
    | 120869 |  9.29 | 
    | 120942 |  6.95 | 
    | 121015 |  3.22 | 
    | 121088 |  -0.59 | 
    | 121161 |  -0.89 | 
    | 121234 |  -1.00 | 
    +--------+------------+ 

    mysql> select * from over_short_adj2; 
    +-------+---------+-----------+ 
    | id | main_id | cd_amount | 
    +-------+---------+-----------+ 
    | 45881 | 119920 |  0.66 | 
    | 45882 | 119920 |  1.19 | 
    | 45907 | 119920 |  4.81 | 
    | 46017 | 120212 |  3.35 | 
    | 46018 | 120066 |  16.85 | 
    +-------+---------+-----------+ 

我使用这个查询来弄完:

SELECT SUM(t1.ds_oversht) sum1, SUM(t2.cd_amount) sum2 
    FROM day_sales2 t1 
    LEFT JOIN over_short_adj2 t2 ON t1.id = t2.main_id 

但SUM1不正确,因为联接是一对多。我怎么能得到这个查询工作?

+0

你是什么意思buy'sum1'不正确? –

+0

+ -------- + ------- + \t \t | sum1 | sum2 | \t \t + -------- + ------- + \t \t | -83.42 | 26.86 | \t \t + -------- + ------- + sum1是-83.42但它应该是-59.34 – user1529918

回答

1

你应该得到的第一个day_sales2SUMLEFT JOIN前:

SELECT 
    t1.id, 
    t1.sum1, 
    SUM(t2.cd_amount) AS sum2 
FROM (
    SELECT id, SUM(ds_oversht) AS sum1 
    FROM day_sales2 
    GROUP BY id 
) t1 
LEFT JOIN over_short_adj2 t2 
    ON t1.id = t2.main_id 
GROUP BY t1.id, t1.sum1 

编辑:

如果你只想要一个行,我觉得不需要JOIN

SELECT 
    (SELECT SUM(ds_oversht) FROM day_sales2), 
    (SELECT SUM(cd_amount) FROM over_short_adj2) 
+0

查询应该只返回一行总和。 – user1529918

+0

@ user1529918,看我的编辑。 –

1

如果你只想从两个表中获得一行总和,你可以使用UNION

SELECT SUM(ds_oversht) from day_sales2 
UNION 
SELECT SUM(cd_amount) from over_short_adj2; 
+0

这肯定不会工作 – user1529918

+0

嗯,或将它,有趣 – user1529918

0
SELECT SUM(sum1) sum1, SUM(sum2) sum2 FROM (
    SELECT 
     t1.id, 
     t1.sum1, 
     SUM(t2.cd_amount) sum2 
    FROM (
     SELECT id, SUM(ds_oversht) sum1 
     FROM day_sales2 
     GROUP BY id 
    ) t1 
    LEFT JOIN over_short_adj2 t2 
     ON t1.id = t2.main_id 
    GROUP BY t1.id, t1.sum1 
    ) t3 

这确实它,谢谢费利克斯的答案。

+0

请参阅我编辑的答案。它更高效,更简单。 –

+0

但加入需要的,因为还有更多的是查询 – user1529918

+0

'选择ds_per,SUM(SUM1)SUM1,SUM(SUM2)SUM2 FROM( \t \t选择 \t \t \t t1.id, t1.ds_per, T1 .ds_sto, \t \t \t t1.sum1, \t \t \t SUM(t2.cd_amount)SUM2 \t \t FROM( \t \t \t SELECT标识,ds_per,ds_sto,ds_date,SUM(ds_ov ersht)SUM1 \t \t \t FROM day_sales \t \t \t GROUP BY ID \t \t)T1 \t \t LEFT JOIN over_short_adj T2 \t \t \t ON t1.id = t2.main_id \t \t \t WHERE t1.ds_sto = 6 AND t1。ds_date BETWEEN '2014年12月29日' 和 '2015年12月27日' \t \t GROUP BY t1.id,t1.sum1 \t \t)T3 GROUP BY ds_sto,ds_per'这是一个完整的查询,伟大工程 – user1529918