3

私はこの問題をあまりにも長い間見つめてきたと思います。システムのメンテナンスを引き継ぎ、レポートの 1 つを修正しようとしています。なんらかの理由で、このレポートの 1 つを除いてすべての数字が正しいのですが、私はこの問題をうまく処理できません。

次のクエリは、データベースに 1014 のトランザクションがあることを示しています。

SELECT COUNT(DISTINCT(store_orders_id))
FROM transactions, store_orders_products
WHERE store_orders_products.store_orders_id = transactions.id
AND transactions.date >= '2013-10-01 00:00:00'
AND transactions.date <= '2013-10-31 23:59:59'
AND store_orders_products.category_name <> ''

store_orders_products には、注文された製品ごとに 1 つの行が含まれるため、DISTINCT() 呼び出しが必要です。複数の製品を含む注文の場合、store_orders_id が重複します。上記のクエリは正しい結果を生成します。実際、これらの日付の間に 1014 のトランザクションがあります。

ここが問題です。完全なレポート クエリを実行すると、返される合計は 1030 です。

SELECT COUNT(DISTINCT(store_orders_id)) as transactions,
SUM(store_orders_products.total + store_orders_products.coupon) as total,
SUM(store_orders_products.coupon) as coupon,
SUM(store_orders_products.shipping) as shipping,
SUM(store_orders_products.tax) as tax, store_orders_products.category_name
FROM transactions, store_orders_products
WHERE store_orders_products.store_orders_id = transactions.id
AND transactions.date >= '2013-10-01 00:00:00'
AND transactions.date <= '2013-10-31 23:59:59'
AND store_orders_products.category_name <> ''
GROUP BY store_orders_products.category_name
ORDER BY store_orders_products.category_name ASC

これにより、次のようなレポートが生成されます。

Transactions | Total    | Coupon | Shipping | Tax    | Category Name
483          | 17863.15 | 0.00   | 1493.50  | 260.56 | Category 1
547          | 21541.47 | 0.00   | 1594.80  | 194.03 | Category 2

ご覧のとおり、これらのトランザクションの合計は 1030 であり、予想される 1014 ではありません。

この問題は、選択した 2 番目の列を追加するだけで発生するようです。たとえば、上記の最初のクエリ ブロックを からSELECT COUNT(DISTINCT(store_orders_id))に変更するとSELECT COUNT(DISTINCT(store_orders_id)), store_orders_products.category_name、1014 件の結果から 1030 件の結果にジャンプします。

役に立つ十分な情報を提供できたことを願っています。これはクエリの問題だと思いますが、私が言ったように、私たちはこのプロジェクトを引き継いだばかりで、まだ慣れてきているので、今は何もゼロから書き直さないようにしています。

4

1 に答える 1

1

カテゴリが相互に排他的であるため、カテゴリの合計を合計すると総合計が得られると想定しているように見えますが、実際にはそうではありません。両方のカテゴリに関連付けられている (16) トランザクションがいくつかあります。

于 2013-11-05T16:25:04.700 に答える