1

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)
4

1 に答える 1

1

あなたのOfferSuggestionDetailがOfferSuggestionHeaderの各行に対して複数の行を持っているというShibormotはおそらく正しいでしょう。それらを結合すると、結合の各行で ofh. Savings フィールドが同じになります。次に、それを合計すると、詳細行の数が乗算されます。

-- 3 つの個別のクエリを使用するように編集: クエリ 2 を使用する場合、次のように書き直すことができます: 現在アクティブ/オープン:

SELECT SUM(CASE WHEN p.current_status < 3 osh.Savings ELSE 0 END ) as TotalOpen
FROM Projects p
LEFT JOIN OfferSuggestionHeader osh
    ON p.offer_id = osh.OfferID
WHERE p.uid = 1 

必要なものが得られることを確認します。存在する場合、クエリ 2 と同じ FROM 句と同じ WHERE 句があるため、次のように組み合わせることができます。

SELECT SUM(osh.Savings) as YTD
      ,SUM(CASE WHEN p.current_status < 3 osh.Savings ELSE 0 END ) as TotalOpen
FROM Projects p
LEFT JOIN OfferSuggestionHeader osh
    ON p.offer_id = osh.OfferID
WHERE p.uid = 1 

MySql は、それ自体が SELECT である選択リスト内の列をサポートします。

あなたの 3 番目のクエリを上記の結合されたクエリに入れると、次のようになります (おそらく、内側のクエリを少しクリーンアップできますが、うまくいくはずです)。

SELECT SUM(osh.Savings) as YTD
      ,SUM(CASE WHEN p.current_status < 3 osh.Savings ELSE 0 END ) as TotalOpen

, (SELECT SUM(ofh2.Savings) as Potential
   from OfferSuggestionHeader ofh2
   LEFT JOIN OfferSuggestionDetail osd2 on ofh2.OfferID = osd2.OfferID
   LEFT JOIN Facilities f2 on osd2.FacilityID = f2.id
   LEFT JOIN UserFacility uf2 on f2.id = uf2.fid
   LEFT JOIN Users u on uf2.uid = u2.uid
   WHERE ofh.OfferID = ofh2.OfferID 
   AND u2.uid = 1
   AND ofh2.OfferID NOT IN(SELECT offer_id FROM Projects WHERE uid = 1
  )


FROM Projects p
LEFT JOIN OfferSuggestionHeader osh
    ON p.offer_id = osh.OfferID
WHERE p.uid = 1 

一歩近づくことを願っています。

于 2013-02-27T03:52:49.730 に答える