2017-07-26 77 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