我想我已经盯着这个问题太久了。我们接管了系统的维护,并试图修复其中的一个报告。出于某种原因,所有数字都是正确的,除了本报告中的一个,我对这个问题没有任何好运。
以下查询显示数据库中有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 <> ''
DISTINCT()调用是必要的,因为store_orders_products为每个订购的产品包含一行,因此对于包含多个产品的订单,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。
当我们只添加第二个选定列时,似乎会出现问题。例如,在上面发布的第一个查询块中从SELECT COUNT(DISTINCT(store_orders_id))
更改为SELECT COUNT(DISTINCT(store_orders_id)), store_orders_products.category_name
会导致从1014个结果跳转到1030个结果。
我希望我提供了足够有用的信息。我确信这是查询的一个问题,但正如我所说,我们刚刚完成了这个项目,并且仍然习惯于事情,所以我们现在不想从头开始重写任何东西。
答案 0 :(得分:1)
看起来你假设这些类别是相互排斥的,因此将类别总数相加将产生总计,但实际上并非如此。有两(16)个交易与这两个类别相关联。