2017-07-25 10 views
0

各ベンダーに1つのSQLテーブルが3つあります。すべてのテーブルには、(id)、(spend)、および(date)の3つの同一の列があります。 (id)は製品IDを表します。 (支出)は、彼らが製品にどれだけ費やしたかです。そして、取引の(日付)。SQL - Union AllとJoinを使用した計算

私は、stackoverflowのおかげで、すべてのテーブルを含む各製品(ID)に費やされた合計でソートすることができました。

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 

は、今私は、各製品(ID)から得た収益を示していますSQL式に新しいテーブル(revTbl)を内蔵したいと思います。ここではUNION作品ALL文です。この4番目の表には、上記の3と同じ(id)という列があります。同じ(日付)列もあります。ただし、この表には別の列(rev)があります。

私はSUM(rev)-SUM(費やし)でソートするSQL文を書いてみたいと思います。私はUNION ALLとして運んでみましたが運がなかったので、UNION ALLを読んだ後、なぜそれが理解できますか?私はJOINステートメントを組み込む必要があると推測していますが、どこから始めるべきかはわかりません。私は適切なSQLステートメントを書くのを助けてください。

答えて

0

2つのサブクエリを作成し、それらを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から条件を削除しました。また、dateがSQLのデータ型であるため、日付の列名を "at"に変更しました。

+0

これは機能しませんでした。 –

+0

エラーが表示されますか?それとも予期しない結果を返しましたか? – Mustafa