2017-07-11 8 views
0

私はこのコードを以下に示します。何らかの理由で返されるEstHrsが間違っています。ほとんどの行は正しいですが、返される値は2倍になり、3倍になります。オフになっている値は、複数の値(x2、x3など)だけずれているようです。集計関数が正しく集計されないのはなぜですか?

スケジュール:

JobNo(テキスト)

WorkCntr(テキスト)

OrderRouting:私は

SELECT 
    s.JobNo, 
    ROUND(SUM(r.TotEstHrs), 3) AS EstHrs 
FROM Scheduling s JOIN OrderRouting r ON s.JobNo = r.JobNo 
    AND s.WorkCntr = r.WorkCntr 
WHERE s.WorkCntr = 'Cutting' 
    AND r.OrderNo NOT IN ('44444', '77777') 
GROUP BY s.JobNo; 

間違ったテーブル構造をやっているかわかりません

JobNo(テキスト)

WorkCntr(テキスト)

TotEstHrs(数が)

+0

による可能性が最も高い、あなたは1 OrderRoutingのための複数の行を返す参加すること。私。同じJobNoとWorkCentreを持つ2つのOrderRouting行または2つのScheduling行がある場合、SUMはそれらの2つの列の一致数の倍数になります。可能であれば、主キーで結合してみてください。 – rayzinnz

+0

クエリを簡略化することができます。スケジューリングテーブルを使用せずに解決できるかもしれません。 – hardkoded

+0

スケジューリングテーブルが必要です。 OrderRoutingには完了したものを含むすべてのジョブがあります – user1452574

答えて

2

最も可能性の高い原因は、スケジュールテーブル内のJobNo & WorkCntrの重複になります。

EDIT ...

WITH 
    cte_DistinctScheduling AS (
     SELECT DISTINCT 
      s.JobNo 
     FROM 
      dbo.Scheduling s 
     WHERE 
      s.WorkCentr = 'Cutting' 
     ) 
SELECT 
    ds.JobNo, 
    ROUND(SUM(r.TotEstHrs), 3) AS EstHrs 
FROM 
    cte_DistinctScheduling ds 
    JOIN dbo.OrderRouting r 
     ON ds.JobNo = r.JobNo 
WHERE 
    r.WorkCntr = 'Cutting' 
    AND r.OrderNo NOT IN ('44444', '77777'); 
+0

私はスケジュールテーブルを単独で実行しましたが、あなたは正しいです、同じジョブ番号の重複したエントリがあります。それは本当にばかだ、私は回避策を理解する必要があります。ありがとう – user1452574

+0

喜んでお手伝いします...詐欺師を削除する簡単な解決策は、CTE(または派生テーブル)を使用してScheduling.JobNoを区別することです。私は答えを例で更新します。 –

+0

ありがとう、非常に役に立ちました、あなたはグループを忘れてしまいましたが、それを加えて、それは完璧に動作します – user1452574

関連する問題