2017-08-26 9 views
1

これは私が開発していますシステムのデータベースの一部であり、クライアントの名前と、このそれぞれのクライアントのすべての販売の合計。つまり、顧客が販売に費やした金額。のMySQL Workbenchのバグは

のは、例を作成してみましょう:第一の状況では

Table client: 
cliId = 1, cliName = "client1"; 

Table product: 
proId = 1, proName = "prod1", proBaseValue = 3; 
proId = 2, proName = "prod2", proBaseValue = 2.5; 
proId = 3, proName = "prod3", proBaseValue = 1; 

Table sale: 
salId = 1, salAddition = 0, salDiscount = 1, sal_cliId = 1; 
salId = 2, salAddition = 2, salDiscount = 0, sal_cliId = 1; 
salId = 3, salAddition = 0, salDiscount = 2, sal_cliId = 1; 

Table saleitems (Weak Entity from the relationship between sale and product): 
sli_salId = 1, sli_proId = 2, sliRealValue = 2.5, sliQuantity = 1; 
sli_salId = 2, sli_proId = 2, sliRealValue = 2.5, sliQuantity = 2; 
sli_salId = 2, sli_proId = 3, sliRealValue = 1, sliQuantity = 1; 
sli_salId = 3, sli_proId = 1, sliRealValue = 3, sliQuantity = 1; 
sli_salId = 3, sli_proId = 2, sliRealValue = 2.5, sliQuantity = 1; 
sli_salId = 3, sli_proId = 3, sliRealValue = 1, sliQuantity = 2; 

、 "salAddition" と "salDiscount" を無視して、私は、次のSQL文を使用して来た:

select cliName, (sum(sliRealValue * sliQuantity)) 
from exampledb.client join exampledb.sale join exampledb.saleitems 
where cliId = sal_cliId and 
salId = sli_salId 
group by cliId; 

そしてそれは完全に働きました。しかし問題は私が "salAddition"と "salDiscount"を数学に含めるときです。理論的には、このためのSQL文は次のようになります。私はそれを動作させるために、すべての追加や、すべての販売からのすべての割引を合計する必要が

select cliName, (sum(sliRealValue * sliQuantity) + sum(salAddition) - sum(salDiscount)) 
from exampledb.client join exampledb.sale join exampledb.saleitems 
where cliId = sal_cliId and 
salId = sli_salId 
group by cliId; 

注意してください。それは単純ではなかった...

上記の例によれば、追加値と割引を無視して、予想される合計値は$ 16であり、これらの属性を含めて合計は15ドルでなければならないが、結果I私の所見は13 $です。 コードと価値の組み合わせを数時間テストした結果、最初の販売ではが加算値と割引値にを1倍したことに気付きました。セカンドセールでは、同じ値に2を掛けています3回目の売却では、値に3を掛けていくなどします(いいえ、Id値とは関係ありません)。

私は...+ sum(salAddition) - sum(salDiscount)......+ sum(salAddition - salDiscount)...に置き換えようとしましたが、私は同じ価値(そして問題)を見出しています。

バグの内容を教えてもらえますか?可能であれば、この問題を解決する方法を教えてください。 MySQL Workbenchにバグが見つかりましたか?
ありがとうございます。

+0

sqlステートメントはmysql workbenchではなくmysqlによって実行されるため、ワークベンチのバグではありません – Shadow

答えて

0

具体的には書いていませんが、追加金額と割引が販売ごとに適用され、販売ごとの商品ごとではなく、数学でのみ有効です。ただし、商品ごとに追加金額と割引額を合計するので、グループを使わないで照会を確認し、合計を十分に理解してください。

これは、最初に売り上げあたりの実際の価値を合計し、追加のものと割引を加算して差し引かなければならないことを意味します。

select c.cliName, sum(t.salevalue+s.salAddition-s.discount) as totalsalevalue 
from (select sli_salId, sum(sliRealValue * sliQuantity) as salevalue 
     from saleitems 
     group by sli_salId) t 
inner join sale s on t.sli_salId=s.salId 
inner join client c on c.cliId=s.sal_cliId 
group by c.cliId 

二つのコメント:

  1. Plsのは、結合条件を明示join構文は、on句ではなく、whereである使用します。パフォーマンスは賢明ですが、違いはありませんが、コードを読みやすくします。

  2. SQL99標準では、選択リスト内のフィールドはグループ別にはなく、グループ別にフィールドに機能的に依存している場合は集計されません。 Mysqlはmysql v5.7.5からこの標準に従っていますので、うまくいくでしょう。

+0

ありがとうございました。出来た!!しかし、まだ、あなたは私たちのためにもう少しあなたの2番目のコメントを説明できますか?また、 'on'節に結合条件を入れないのは残念です。確かに、それはコード方法をより美しくします。再度、感謝します! –

+0

クエリは、最初に売り上げごとの売り上げを集計します。その結果、1回の売り上げで1行になります。これはサブクエリで発生します。次に、売上テーブルに割引と追加金額を加算します。これにより、追加金額と割引の重複が防止されます。私が書いたように、集計とグループ化なしで元のクエリを実行すると、何がうまくいかなかったのか理解できます。 – Shadow