【问题标题】:MySQL UNION does not seem to work correctlyMySQL UNION 似乎无法正常工作
【发布时间】:2016-04-01 21:21:17
【问题描述】:

我有一个用于从订单数据库中提取数据的 SQL 查询。我正在查询 2 个表并使用 UNION ALL 组合结果。但是,UNION ALL 似乎没有按预期工作。这是我正在使用的查询:

SELECT year(oc_order.date_added) AS year, COUNT(oc_order.order_id) as cnt, SUM( ifnull(oc_order.new_total,oc_order.total) ) as total
FROM oc_order
WHERE oc_order.order_status_id IN (1,3,5)
    AND MONTH(oc_order.date_added) BETWEEN '01' AND '02'
    AND DAY(oc_order.date_added) BETWEEN '01' AND '31'
GROUP BY year(oc_order.date_added)

UNION ALL

SELECT ifnull(year(str_to_date(oc_return_custom.date_added,'%d-%m-%Y %H:%i:%s')),year(str_to_date(oc_return_custom.date_added,'%Y-%m-%d %H:%i:%s')) ) AS year, COUNT(oc_return_custom.return_id) as cnt, SUM( oc_return_custom.total ) as total
FROM oc_return_custom
WHERE ifnull(MONTH(str_to_date(oc_return_custom.date_added,'%d-%m-%Y %H:%i:%s')),MONTH(str_to_date(oc_return_custom.date_added,'%Y-%m-%d %H:%i:%s')) ) BETWEEN '01' AND '02'
    AND ifnull(DAY(str_to_date(oc_return_custom.date_added,'%d-%m-%Y %H:%i:%s')),DAY(str_to_date(oc_return_custom.date_added,'%Y-%m-%d %H:%i:%s')) ) BETWEEN '01' AND '31'
GROUP BY ifnull(year(str_to_date(oc_return_custom.date_added,'%d-%m-%Y %H:%i:%s')),year(str_to_date(oc_return_custom.date_added,'%Y-%m-%d %H:%i:%s')) )
ORDER BY year DESC

这是我从查询中得到的:

+=======+========+=======+
| year  | cnt    | total |
+=======+========+=======+
| 2016  |  200   |  1000 |
| 2016  |   50   |   200 |
| 2015  |  100   |   800 |
| 2015  |   10   |    50 |
+=======+========+=======+

但这正是我想要得到的:

+=======+========+=======+
| year  | cnt    | total |
+=======+========+=======+
| 2016  |  250   |  1200 |
| 2015  |  110   |   850 |
+=======+========+=======+

谁能告诉我我做错了什么???

注意事项: oc_order 表的 date_added 列是日期时间,而 oc_return_custom 的 date_added 列只是文本。

【问题讨论】:

    标签: mysql union union-all


    【解决方案1】:

    UNION ALL 只是将两个由 单独 GROUP BY 操作生成的数据集放在一起。

    要获得预期的结果集,您必须将查询包装在子查询中并应用额外的GROUP BY

    SELECT year, SUM(cnt) AS cnt, SUM(total) AS total
    FROM ( ... your query here ...) AS t
    GROUP BY year
    

    【讨论】:

    • 我在 UNION 上准备了大约 3 次文档,但我没有意识到这一点。我尝试使用子查询,但我想我做错了什么! Ευχαριστώ!!!
    猜你喜欢
    • 2021-08-11
    • 2017-09-04
    • 2012-05-06
    • 2013-02-17
    • 2017-10-09
    • 2017-08-03
    • 2014-05-02
    • 2011-09-11
    • 2016-02-11
    相关资源
    最近更新 更多