2016-04-15 49 views
1

ジョブ上の債権者のリストを提供するSQLステートメントがあります。 イメージの例では、両方の債権者が同じジョブに属しています。 したがって、TOTALSを表示している最後の行では、同じジョブであるため、ジョブの数は1です。また、NotPODと言う列も、ちょうど1と言って正しいです。 しかし、他のすべての列については、合計を追加しています。 FL(それはピースタイプです)と呼ばれる列のように。この仕事には1枚のFLピースタイプしかありません。しかし、仕事には2人の債権者がいるので、1つしか存在しないにもかかわらず、合計は2つを表示しています。WITH ROLLUPは一部の列で合計を計算していません

enter image description here

私は、合計が仕事とNotPODのための正しい方法を知りません。私はあなたの問題は、条件によってあなたのグループであることを疑う

SET group_concat_max_len=10000000; 
set @sql = null; 
select 
    group_concat(distinct 
    concat(
     'sum((select sum(jp1.AdvisedQty) 
       from job_pieces jp1 
       left join piecestype pt1 on jp1.TypeID = pt1.ID 
       where jp1.jobid=jn.id and pt1.code=''', pt.Code , ''' 
      )) AS `', pt.Code, '`' 
    ) 
) into @sql 
FROM creditor c 
LEFT JOIN invoicedetail i on c.ID = i.creditorId 
LEFT JOIN job_new jn ON i.JobID = jn.ID 
LEFT JOIN job_pieces jp ON jp.JobID = jn.ID 
LEFT JOIN piecestype pt on jp.TypeID = pt.ID 
WHERE c.Company_ID = ?compid; 

set @sql = concat('select 
     ifnull(c.Name,''TOTAL'') as Name, 
     COUNT(distinct jn.ID) as Jobs, 
     sum(case when (select count(jbs.status) from jobstat jbs 
       where jbs.jobid=jn.id and jbs.Status=''DEL'')>0 
         then 1 else 0 end) as Delivered, 
     sum(case when (select count(jbs.status) from jobstat jbs 
       where jbs.jobid=jn.id and jbs.Status=''POD'')>0 
         then 1 else 0 end) as POD, 
     SUM((select COUNT(ID) from job_debriefs 
       WHERE JobID = jn.ID)) as Debriefs, 
     sum(jn.OutTurn) as Outturn, 
     SUM(jn.ActualWeight) as GrossWt, 
     ', @sql, ' 
    FROM creditor c 
    LEFT JOIN invoicedetail i on c.ID = i.creditorId 
    LEFT JOIN job_new jn ON i.JobID = jn.ID 
    LEFT JOIN job_pieces jp ON jp.JobID = jn.ID 
    LEFT JOIN piecestype pt on jp.TypeID = pt.ID 
    WHERE c.Company_ID = ', ?compid, GROUP BY c.Name WITH ROLLUP 
+0

クエリをフォーマットすることはできますか? –

+0

@GordonLinoff申し訳ありませんが、どういう意味ですか? – user123456789

+0

それから 'SELECT @ sql'を終わりに - それは起こっているすべてのゲームの後にSQLを見ると役立つかもしれません。 –

答えて

0

は、ここでSQL文です。

あなたはGROUP BY c.Name WITH ROLLUPを実行します。私が理解する限り、あなたのc.Nameは債権者の名前です。

あなたのレコードのジョブIDまたは他の一意の識別子でグループ化してみてください。

+0

GROUP BYを変更すると間違ったデータが返されます。債権者IDまたは求人IDを使用すると、結果が間違っています。 – user123456789

+0

あなたは、データを見ることなく非常に理解しにくい多くの条件をクエリに持っています。ロールアップは正常に動作します。 'rollup'ではなく、別の計算を行うだけです。サンプルデータの小さなダンプなしでそれ以上のことはできません。 – Tata

+0

しかし、 'rollup'は全体のジョブが1だが他のすべての列を一緒に追加しているということでどのように修正されていますか?ロールアップなしで最下行の合計を計算する別の方法はありますか? – user123456789

2

count(distinct)sumを使用すると、with rollup -flagは異なる処理を行います。

COUNT(distinct jn.ID)の場合、表示されているすべてのデータに対して個別のジョブIDが表示されます。それはおそらくあなたが望むものです。

sum(case...) as PODのような合計列の場合、表示されるすべての値の合計が表示されます。ジョブのステータスが「POD」の場合、PODは「2」になります。

NotPOD-Columnについて:私はあなたのクライアント(Jobs - POD)でcalcaluteしていると仮定しています.PODは0なので(2であった可能性もあります)、うまく見えます。私はあなたもあなたのクライアントの "ユニット"を計算すると仮定します(4つのタイプの合計)。そうでない場合、あなたのコードはあなたの写真に合っていません。

どのように修正するのですか?

まあ、基本的にはあなただけが表示されている値の合計を持ってしたくない主な理由は、with rollupを使用することはできません、それはwith rollupが何のためにあるのかです。

最も簡単な解決策は、合計行を手動で計算し、unionとマージすることです。次のようなもの:

select c.Name as Name, 
    COUNT(distinct jn.ID) as Jobs, 
    ... 
    sum(jn.OutTurn) as Outturn, 
    SUM(jn.ActualWeight) as GrossWt, 
    ... 
    FROM creditor c 
    LEFT JOIN invoicedetail i on c.ID = i.creditorId 
    LEFT JOIN job_new jn ON i.JobID = jn.ID 
    -- !!! DO NOT USE LEFT JOIN job_pieces jp ON jp.JobID = jn.ID !!! 
    -- !!! DO NOT USE LEFT JOIN piecestype pt on jp.TypeID = pt.ID !!! 
    WHERE c.Company_ID = ', ?compid, GROUP BY c.Name, ' 
UNION 
    ''Total'', 
    COUNT(distinct jn.ID) as Jobs, 
    ... 
    sum(jn.OutTurn) as Outturn, 
    SUM(jn.ActualWeight) as GrossWt, 
    ... 
    -- you have to figure out what number you need here for the pieces 
    -- you probably want to seperate that part too (as you did with @sql) 
    -- (select sum(jp1.AdvisedQty) from job_pieces jp1 ...) as FL 
    ... 
    from job_new jn 
    WHERE exists(select 1 
       FROM creditor c 
       JOIN invoicedetail i on c.ID = i.creditorId 
       where i.JobID = jn.ID and c.Company_ID = ', ?compid, ' 
       ) 

いいえgroup by第2部!あなたがあたりピース - 合計のために何をしたい値を把握する必要があり、あなたはおそらくあなたのselect group_concat(distinct ...

、警告にも同様のステートメントでそれらを準備したい :私が正しくあなたのデータモデルを理解していれば、あなたは絶対に持っていますあなたは(あなたが仕事に第二値を追加してみて、それを見ることができる)つのジョブで1 jobpieceまたはpiecetype、より多くを持っているとき、彼らは自分の価値観を壊してしまいますので、

LEFT JOIN job_pieces jp ON jp.JobID = jn.ID 
LEFT JOIN piecestype pt on jp.TypeID = pt.ID 

文を削除。 invoicedetailに同じ仕事が2回ある可能性がある場合は、その部分も修正する必要があります。

ユニオン部では、顧客に参加することはできません(何度も何度も数えます)。

関連する問題