3 つの異なる方法で 1 つの列からデータを取得しようとしています。私は、ベンダーのオファーと顧客が受け入れたオファー (プロジェクトになる) を扱っています。
完了したかどうかにかかわらず、これまでのすべてのプロジェクトからの節約額の合計を取得したいと思います。次に、現在の節約、つまり現在開いているプロジェクトからの節約を取得しています。最後に、彼らがまだ行動していない、彼らに提供されている合計金額を見つける必要があります。
このクエリで最初の 2 つを処理しました。
SELECT SUM(osh.Savings) as YTD,
SUM(case when p.current_status < 3 then Savings end) AS "Open Savings"
FROM OfferSuggestionHeader osh LEFT JOIN
Projects p
ON p.offer_id = osh.OfferID
WHERE p.uid = '1'
ここまでは順調ですね。最後のピースをつかむために必要なテーブルを結合し始めると、問題が発生します。特異なクエリは次のようになります (そして機能します)。
SELECT SUM(ofh.Savings)
from OfferSuggestionHeader ofh
LEFT JOIN OfferSuggestionDetail osd
on ofh.OfferID = osd.OfferID
LEFT JOIN Facilities f
on osd.FacilityID = f.id
LEFT JOIN UserFacility uf
on f.id = uf.fid
LEFT JOIN Users u
on uf.uid = u.uid
WHERE u.uid = 1
AND ofh.OfferID NOT IN(SELECT offer_id FROM Projects WHERE uid = 1)
私はそれらを混合するために半ダースの異なる方法を試しましたが、すべて失敗に終わりました. 数を複数回足しているような感じです。
ヘルプやポインタをありがとう。
編集: - - - - - - - -
CASE
したがって、ステートメントを表示したまま大きな合計を取得するために必要な結合を行うクエリを次に示します。
SELECT (osh.Savings) as "Potential",
(case when p.current_status < 3 then osh.Savings else null end) AS "Open Savings",
(case when p.uid=1 then osh.Savings else null end) AS "YTD"
FROM OfferSuggestionHeader osh
LEFT JOIN OfferSuggestionDetail osd
ON osd.OfferID = osh.OfferID
LEFT JOIN UserFacility uf
ON uf.fid = osd.FacilityID
LEFT JOIN Projects p
ON p.uid = uf.uid
WHERE p.uid = '1'
SUM
あなたの何人かが提案したように、私は何が起こるかを見るためにその部分を削除しました. 案の定、値ごとに 3 つのレコードが取得されます。
これは問題をより明確にするのに役立ちますか?
編集 #2: ------------ 要求に応じて、個々の作業クエリを次に示します。
YTD:
/*YTD Savings*/
SELECT SUM(osh.Savings) as YTD
FROM Projects p
LEFT JOIN OfferSuggestionHeader osh
ON p.offer_id = osh.OfferID
WHERE p.uid = 1
現在アクティブ/オープン:
/*total from open projects*/
SELECT SUM(osh.Savings) as TotalOpen
FROM Projects p
LEFT JOIN OfferSuggestionHeader osh
ON p.offer_id = osh.OfferID
WHERE p.uid = 1 AND p.current_status < 3
そして最後に、潜在的な節約の合計:
/*POTENTIAL*/
SELECT SUM(ofh.Savings) as Potential
from OfferSuggestionHeader ofh
LEFT JOIN OfferSuggestionDetail osd
on ofh.OfferID = osd.OfferID
LEFT JOIN Facilities f
on osd.FacilityID = f.id
LEFT JOIN UserFacility uf
on f.id = uf.fid
LEFT JOIN Users u
on uf.uid = u.uid
WHERE u.uid = 1
AND ofh.OfferID NOT IN(SELECT offer_id FROM Projects WHERE uid = 1)