2017-07-26 69 views
1

我有两个成功的SQL查询,我试图将其合并为1.一个查询获取所有产品的总成本,另一个查询获得这些产品的总收入。我想有第三个查询按利润分类(收入 - 成本)。SQL Server - 使用SQL JOIN和UNION

查询1使用UNION ALL从3个类似表中按产品id(id)总和总成本(花费)。

SELECT id, SUM(spend) as spend_total 
       FROM (
        SELECT id, spend 
        FROM vendor_1 
        UNION ALL 
        SELECT id, spend 
        FROM vendor_2 
        UNION ALL 
        SELECT id, spend 
        FROM vendor_3 
       ) as SpendTotal 
       GROUP BY id ORDER BY spend_total DESC 

查询2总结了总收入(REV)1台

SELECT id, SUM(rev) as rev_total 
       FROM income 
       GROUP BY id ORDER by rev_total DESC 

这里是连接两个和(REV - 花)排序是我的失败尝试

SELECT income.id, total_rev - total_spend as result 
       FROM (SELECT id, SUM(rev) as total_rev 
         FROM income 
         GROUP BY id) as rev 
       JOIN (SELECT id, SUM(spend) as total_spend 
        FROM (
         SELECT id, spend 
         FROM vendor_1 
         UNION ALL 
         SELECT id, spend 
         FROM vendor_2 
         UNION ALL 
         SELECT id, spend 
         FROM vendor_3 
        ) as SpendTotal 
        GROUP BY id) as vendor_1 ON vendor_1.id = income.id order by result DESC 
+1

结果怎么了?你能请你展示结果和预期结果吗? – Eli

+1

“失败的尝试”是什么意思?你有错误吗?你没有得到正确的结果吗? –

+0

@SeanLange击败你;) – Eli

回答

1

SELECTJOIN中,您使用的是income.id而不是rev.id

你可以试试下面的查询:

SELECT id, result 
FROM (
    SELECT rev.id, rev.total_rev - vendor_4.total_spend AS result 
    FROM (
     SELECT id, SUM(rev) AS total_rev 
     FROM income 
     GROUP BY id 
     ) AS rev 
    JOIN (
     SELECT id, SUM(spend) AS total_spend 
     FROM (
      SELECT id, spend 
      FROM vendor_1 

      UNION ALL 

      SELECT id, spend 
      FROM vendor_2 

      UNION ALL 

      SELECT id, spend 
      FROM vendor_3 
      ) AS SpendTotal 
     GROUP BY id 
     ) AS vendor_4 ON vendor_4.id = rev.id 
    ) R 
ORDER BY result DESC 
+0

完美!谢谢@Arulkumar非常感谢您的快速回复 –

+0

顺便说一下,在倒数第二行的R是什么? –

+0

只是查询块的别名,它帮助使用'ORDER BY结果' – Arulkumar

0

你应该使用一个以上的子查询。试试这个 -

select T1.*,T2.* 
FROM 
(
SELECT id, SUM(spend) as spend_total 
       FROM (
        SELECT id, spend 
        FROM vendor_1 
        UNION ALL 
        SELECT id, spend 
        FROM vendor_2 
        UNION ALL 
        SELECT id, spend 
        FROM vendor_3 
       ) as SpendTotal 
       GROUP BY id 
) as T1 
JOIN 
( 
       SELECT id, SUM(rev) as rev_total 
       FROM income 
       GROUP BY id 
) as T2 
ON T1.Id = T2.Id