2017-05-09 2 views
1

私は固執しているように見える質問があり、問題の解決方法がわかりません。私を捨てているのはクエリの途中のセクションだけです。私はちょうど左の結合を使用してフィールドの合計コストを数えて合計し、合計が正しいようにしたい。私は問題は、同じテーブルにそのアカウントに関連する項目が2つ以上ある場合、それが複数回合計され、合計が正しくないということです。ここでは私が探している私は何とで苦労....は、カウントと合計チャレンジ後に正しい合計で結合したままになります。

left join 
(select distinct (soid), count(*) as oaccount, sum(amount) as c3 from 
soorderdetails where soorderdetails.description like 'Installation%' or 
soorderdetails.description like 'Training%' or soorderdetails.description 
like 'Fusion Report%' group by soid) as o on o.soid=s.soid 


The result I would like to obtain is: 
    Job# | (c3) | Soid 
    ----- | -----|----- 
    223 | 2000 | 212 (1 record - c3 amount - 1=2000) 
    224 | 300 | 213 (2 record - c3 amount - 1=100 + 2=200) 
    225 | 4333 | 214 (1 record - c3 amount - 1=4333) 
    226 | 1000 | 215 (3 record - c3 amount - 1=200 + 2=300 + 3=500) 

    But I am getting this.... 

    Job# | (c3) | Soid 
    -----| -----|----- 
    223 | 2000 | 212 (1 record...sum is correct here) 
    224 | 600 | 213 (2 record - 1=100x2 + 2=200x2)=WRONG 
    225 | 4333 | 214 (1 record...sum is correct here) 
    226 | 2500 | 215 (3 record - 1=200x3 + 2=300x3 + 3=500x3)=WRONG 

がそれぞれ異なったため(C3)フィールド(の総和と一緒にすべての異なる(soid)レコードを表示することであるセクションですsoid)レコード。

上記のクエリでは、C3の合計を表示できます。レコードが1つだけの場合、合計が正しく表示されます。複数のレコードがある場合、レコードの数には、見つかったsoidの一致数が乗算されて合計されます。私はここにあるソリューションのいくつかを採用しようとしましたが、それでも正しく表示することはできません。誰も助けることができるだろうか?先進的でありがとう!

  • 表1は、
  • 表2は、私はテーブルを結合左しようとしていsoid、説明および量フィールド(o.soid)

  • を有するマッチングsoid idフィールド(s.soid)を有します2をテーブル1に追加します。

  • 金額欄を適切に合計したいと思います。今のところ、「金額」の合計に、そのレコードで見つかったカウント数が乗算されているようです。ありがとうございました!
SELECT DISTINCT (jobnumber) as l1, 
       c2 as l2, 
       sum(isnull(c3,0)) as l3, 
       sum((isnull(c3,0)/150)*50) as l4, 
       sum(c5) as l5, sum(c6) as l6,sum(c5+c6) as l7, 
       sum(c5*25.27) as l8, 
       isnull(c9,0) as l9, 
       (sum(c5*25.27)+(isnull(c9,0))) as l10, 
       sum((isnull(c3,0)/150)*50)-(sum(c5*25.27) 
             +(isnull(c9,0))) as l11 , 
       sum(isnull(c3,0))-(sum(c5*25.27)+(isnull(c9,0))) as l12 
FROM (
     SELECT DISTINCT (j.jobnumber), 
         customername as c2, 
         c3, 
         c5, 
         c6, 
         c9 
     FROM dbo.SOOrders as s 
     LEFT JOIN (
       SELECT DISTINCT (jobid), 
            COUNT(*) as s9, 
            sum(total) as c9 
       FROM apvouchers 
       GROUP BY jobid 
       ) as v ON v.jobid = s.jobid 
     LEFT JOIN (
       SELECT DISTINCT (soid), 
            COUNT(*) as oaccount, 
            SUM(amount) as c3 
       FROM soorderdetails 
       WHERE description LIKE 'Installation%' 
        OR description LIKE 'Training%' 
        OR description LIKE 'Fusion Report%' 
       GROUP BY soid 
       ) as o ON o.soid = s.soid 
     INNER JOIN sccalls as t ON t.jobid = s.jobid 
     INNER JOIN (
        SELECT DISTINCT(callid), 
            COUNT(*) as myaccount, 
            SUM(actualhours) as c5, 
            SUM(overtimehours) as c6 
        FROM scqreportlabors 
        WHERE actualhours > 0 
        GROUP BY callid 
       ) as r ON r.callid = t.callid 
     LEFT JOIN ShAgents ON AgentID = TechnicianID 
     LEFT JOIN arcustomers as c ON c.customerid = s.customerid 
     INNER JOIN icjobs as j ON j.jobid = s.jobid 
     WHERE j.active = 1 
    ) as x 
GROUP BY jobnumber, c2, c9 
ORDER BY jobnumber DESC 
+2

サンプルデータと予想される出力を追加してください。 – Kevin

+0

dbスキーマ、サンプルデータ、および期待される出力を表示します。 \t [** How-to-Ask **](http://stackoverflow.com/help/how-to-ask) \t \t [**スタート**] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)質問品質を改善し、より良い回答を得る方法を学ぶことができます。 [、最小完全、かつ検証例を作成する方法** **] \t(http://stackoverflow.com/help/mcve) \tはhttp://rextester.com –

+0

でサンプルを作成してみ何'soorderdetails'テーブルに対してサブクエリだけを実行すると結果が得られますか? c3は期待されるものを返しますか?問題がサブクエリ内に存在する場合、表示されたカッコ内のすべてが自己完結型であるため、LEFT JOINとは何の関係もありません。問題のサブクエリは、あなたが 'amount'フィールドに格納されているものを理解していないか、そのテーブルで正規化の問題があることを示唆しています。 – DanK

答えて

0

カップルの事

がここで起こってここ

いっぱいクエリがある... ...

あなたは(選択あなたメインで)DISTINCTを必要としないとGROUP BY、それは冗長です。グループ化は、すでにレコードが明瞭になります。

LEFT JOIN 
(SELECT soid, COUNT(*) as oaccount, SUM(amount) as c3 
    FROM soorderdetails 
    WHERE soorderdetails.description like 'Installation%' 
    OR soorderdetails.description like 'Training%' 
    OR soorderdetails.description like 'Fusion Report%' 
    GROUP BY soid 
) AS o ON o.soid = s.soid 

私はあなたのために行っていたと思う何、のみにごSUM(amount)DISTINCT修飾子を追加したのと同じ一意の値にSUM(DISTINCT amount)を合計である:

LEFT JOIN 
(SELECT soid, COUNT(*) as oaccount, SUM(DISTINCT amount) as c3 
    FROM soorderdetails 
    WHERE soorderdetails.description like 'Installation%' 
    OR soorderdetails.description like 'Training%' 
    OR soorderdetails.description like 'Fusion Report%' 
    GROUP BY soid 
) AS o ON o.soid = s.soid 

ことすべての言った...これに基づいて:複数のレコードがある場合ただし、「量」は を取得

を乗じました私はあなたがすべてで合計をしたくない推測しているレコードの

の数は:素晴らしいことだ

LEFT JOIN 
(SELECT soid, COUNT(*) as oaccount, amount as c3 
    FROM soorderdetails 
    WHERE soorderdetails.description like 'Installation%' 
    OR soorderdetails.description like 'Training%' 
    OR soorderdetails.description like 'Fusion Report%' 
    GROUP BY soid, amount 
) AS o ON o.soid = s.soid 

、) SUM(DISTINCT..ので、操作は本当にパフォーマンスを破壊します。

+0

あなたの提案と例をありがとう。私はそれを見る時間を費やしていただきありがとうございます。私は初めにそれを間違って説明しているかもしれませんが、私は今私が正しく探している情報を更新したと思います。私は実際の合計が欲しいですが、上で提案されたクエリが示すように複数のレコードを表示していない、私は私が目指していたものの新しい改訂版が今よりよく説明されると思います。もう一度おねがいします。どんな提案も参考になります。 – Missingsiam

+0

@Missingsiam問題ありません。この左結合の内部選択(派生テーブル)部分だけを実行すると、間違った 'SUM(amount)'が得られますか?またはメインクエリを実行した後は間違っていますか? –

+0

@Missingsiam明日まではもう利用できませんが、基本的には2つのうちの1つが起こっています。私の前のコメントを試して内側のselectを実行し、値が重複している場合は、そのテーブルの重複を修正するために 'SUM(DISTINCT amount)'に変更してください。値が正しい場合は、メインクエリの何かが重複を引き起こしているので、すべてを調べなければなりません。 :D –

関連する問題