【问题标题】:Trying to order a query after using ROLLUP尝试使用 ROLLUP 后对查询进行排序
【发布时间】:2014-05-30 07:55:35
【问题描述】:

在mysql中,我需要按年/月顺序排列结果:

Month          Mod1    Mod2    Mod3
Jan/2013        5       4       2
Jan/2013        1       5       3
Total           6       9       5
Feb/2013        6       3       2
Feb/2013        2       1       4
Total           8       4       6
Mar/2014        6       3       2
Mar/2014        2       1       4
Total           8       4       6

按年/月顺序排列应该是:

Month          Mod1    Mod2    Mod3
Mar/2014        6       3       2
Mar/2014        2       1       4
Total           8       4       6
Feb/2013        6       3       2
Feb/2013        2       1       4
Total           8       4       6
Jan/2013        5       4       2
Jan/2013        1       5       3
Total           6       9       5

查询是:

SELECT
   month,
   year,
   SUM(IF(mod = 1, 1, 0)) AS mod1,
   SUM(IF(mod = 2, 1, 0)) AS mod2,
   SUM(IF(mod = 3, 1, 0)) AS mod3
FROM
   DW_RM_Log
WHERE
   ...
GROUP BY
   year, month
WITH ROLLUP
HAVING year IS NOT NULL AND month IS NOT NULL

我不能只在末尾插入 ORDER BY 年月 DESC,因为我收到以下错误:'SQLSTATE[HY000]: 一般错误:1221 CUBE/ROLLUP 和 ORDER BY 的使用不正确'。有什么建议吗?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    在 MySQL 中,group by 进行排序。尽管 implicit 排序现在已被弃用,但您仍然可以安全地进行显式排序。以下应该做你想做的事:

    SELECT month, year,
           SUM(mod = 1) AS mod1, SUM(mod = 2) AS mod2, SUM(mod = 3) AS mod3
    FROM DW_RM_Log
    WHERE ...
    GROUP BY year DESC, month DESC WITH ROLLUP
    HAVING year IS NOT NULL AND month IS NOT NULL;
    

    请注意,我还简化了 sum() 条件。在 MySQL 中,您可以只使用条件本身,而不是包括 if()

    【讨论】:

      【解决方案2】:

      要回答您关于在 WITH ROLLUP 查询上施加 ORDER BY 的具体问题,您只需将其转换为子查询:

      SELECT *
      FROM
      (
      SELECT
         month,
         year,
         SUM(IF(mod = 1, 1, 0)) AS mod1,
         SUM(IF(mod = 2, 1, 0)) AS mod2,
         SUM(IF(mod = 3, 1, 0)) AS mod3
      FROM
         DW_RM_Log
      WHERE
         ...
      GROUP BY
         year, month
      WITH ROLLUP
      HAVING year IS NOT NULL AND month IS NOT NULL
      ) a 
      ORDER BY year, month DESC
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-01
        • 1970-01-01
        相关资源
        最近更新 更多