【发布时间】:2014-02-27 08:35:18
【问题描述】:
我正在尝试制作一些关于我们的订单和销售的产品、收入和总重量的报告,但是当我将我们的订单组合在一起时,我在一些应该返回相同的查询中得到不同的结果。
以下是我的疑问:
每月
SELECT
MONTH(orders.date_purchased) as date,
YEAR(orders.date_purchased) as year,
count(DISTINCT orders.orders_id) AS total_orders,
categories.fields_23 as currency
FROM
orders_shipping_products
Inner Join orders ON orders.orders_id = orders_shipping_products.orders_id
Inner Join categories ON categories.fields_6 = orders.shopping_store_category_id
WHERE
orders.orders_status NOT IN (0, 1, 99)
GROUP BY
date,
year,
categories.fields_23
ORDER by
YEAR(orders.date_purchased),
MONTH(orders.date_purchased) ASC,
categories.fields_23
2012 年返回下表,共 353 个:
+------+------+--------------+----------+
| date | year | total_orders | currency |
+------+------+--------------+----------+
| 11 | 2012 | 86 | EUR |
| 12 | 2012 | 267 | EUR |
+------+------+--------------+----------+
每年
SELECT
YEAR(orders.date_purchased) as year,
count(DISTINCT orders.orders_id) AS total_orders,
categories.fields_23 as currency
FROM
orders_shipping_products
Inner Join orders ON orders.orders_id = orders_shipping_products.orders_id
Inner Join categories ON categories.fields_6 = orders.shopping_store_category_id
WHERE
orders.orders_status NOT IN (0, 1, 99)
GROUP BY
year,
categories.fields_23
ORDER by
YEAR(orders.date_purchased),
categories.fields_23
它在 2012 年返回以下内容
+------+--------------+----------+
| year | total_orders | currency |
+------+--------------+----------+
| 2012 | 351 | EUR |
+------+--------------+----------+
唯一改变的是total_orders,产品总量,收入和重量是一样的。每月检查时,我只收到两个订单。我还检查了按 QUARTER, YEAR 进行的选择和分组,返回以下内容:
+---------+------+--------------+----------+
| quarter | year | total_orders | currency |
+---------+------+--------------+----------+
| 4 | 2012 | 351 | EUR |
+---------+------+--------------+----------+
这让我想到,当我想每月生成一份报告时,我的选择可能有问题
带汇总
Daniel 让我尝试在查询中添加 WITH ROLLUP,以下是我所做的并得到回报
SELECT
MONTH(orders.date_purchased) as date,
YEAR(orders.date_purchased) as year,
count(DISTINCT orders.orders_id) AS total_orders,
categories.fields_23 as currency
FROM
orders_shipping_products
Inner Join orders ON orders.orders_id = orders_shipping_products.orders_id
Inner Join categories ON categories.fields_6 = orders.shopping_store_category_id
WHERE
orders.orders_status NOT IN (0, 1, 99)
GROUP BY
year,
date,
categories.fields_23 WITH ROLLUP
这是返回的数据:
+------+------+--------------+----------+
| date | year | total_orders | currency |
+------+------+--------------+----------+
| 11 | 2012 | 86 | EUR |
| 11 | 2012 | 86 | NULL |
| 12 | 2012 | 267 | EUR |
| 12 | 2012 | 267 | NULL |
| NULL | 2012 | 351 | NULL |
+------+------+--------------+----------+
【问题讨论】:
-
orders表是否有唯一的orders_id或者是否一个订单也有 11 月行和 12 月行? -- 另外,你的意思是 353 而不是 253。 -
Orders_id 是唯一的,如果是这样的话,其他值比如产品总量,应该也会受到影响吧?
-
没错,所以确实是个谜。您可以做的一个简单而愚蠢的事情是找到在第一个结果中但不在第二个结果中的 order_id 并在那里嗅探。
-
在月报上,尝试使用
group by date_format( orders.date_purchased, '%Y%m' )。 -
您能否使用
WITH ROLLUP运行您的第一个查询,颠倒年份、日期顺序,并删除ORDER BY子句,如下所示:...GROUP BY year, date, categories.fields_23 WITH ROLLUP;你对date=NULL有什么看法(即所有月份)? (请参阅dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.html)(也许您应该将date重命名为month,以便清楚起见。)
标签: mysql