【问题标题】:mysql group by year diffrent from group by year and monthmysql 按年分组不同于按年和月分组
【发布时间】: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


【解决方案1】:

我重新检查了 orders_id,它不是唯一的,实际上有 2-3 个相同的订单 ID,其中一些位于不同的月份。发现orders_id 和另一列的组合构成了真正的唯一id。将此添加到我的加入中,解决了所有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2012-12-10
    • 2011-07-21
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多