2017-07-25 27 views
0

我有3个SQL表,每个供应商一个。所有表格都有3个相同的列:(id),(花费)和(日期)。 (id)代表产品ID。 (花费)是他们花在产品上的多少。和(交易日期)。SQL - 使用Union All和Join进行计算

感谢stackoverflow,我能够根据每个产品(id)包括所有表花费的总和进行排序。这里是工会的作品ALL声明:

SELECT id, SUM(spend) as total 
        FROM (
         SELECT id, spend, date 
         FROM vendor1 
         WHERE date BETWEEN '$dateStart' AND '$dateEnd' 
         UNION ALL 
         SELECT id, spend, date 
         FROM vendor2 
         WHERE date BETWEEN '$dateStart' AND '$dateEnd' 
         UNION ALL 
         SELECT id, spend, date 
         FROM vendor3 
         WHERE date BETWEEN '$dateStart' AND '$dateEnd' 
        ) as SpendTotal 
        GROUP BY id 
        ORDER BY total DESC 

现在我想的SQL公式,列出从各产品(ID)获得收入纳入新表(revTbl)。这第四张表与上面提到的3有相同的列(id)。它也有相同的(日期)列。但是,该表有一个名为(rev)的不同列。

我想编写一个按SUM(rev)-SUM(花费)排序的SQL语句。我试图将它作为UNION ALL包括在内,但没有运气,并且在阅读了UNION之后,我明白了为什么。我猜我需要加入一个JOIN语句,但不知道从哪里开始。请帮我写出正确的SQL语句。

回答

0

您可以创建两个子查询并通过ID将它们加入。类似这样的:

Select rev.id, total_rev - rev_total as result from 
     (SELECT id, SUM(rev) as total_rev 
        FROM rev 
        GROUP BY id) as rev 
join (SELECT id, SUM(spend) as spend_total 
        FROM (
         SELECT id, spend, at 
         FROM vendor1 
         UNION ALL 
         SELECT id, spend, at 
         FROM vendor2 
         UNION ALL 
         SELECT id, spend, at 
         FROM vendor3 
        ) as SpendTotal 
        GROUP BY id) as spend on spend.id = rev.id order by result; 

为了简单起见,我从您的sql中删除了条件。据我所知,还将“日期”列名更改为“at”,因为日期是sql数据类型。

+0

这没有奏效。 –

+0

你有错误吗?或者它返回了意外的结果? – Mustafa