首页 > 解决方案 > 对 SQL 完全陌生,需要通过汇总帮助分组

问题描述

我正在使用工作台(没有编程经验)学习 MYSQL,并且我已经成功地创建了一个总销售额和按月分组的程序。但是,我的销售总额命名为 12 月,我有 2 月 2 日。为什么是这样?我一直在寻找答案,但似乎找不到。这是我的代码:

DELIMITER //
CREATE PROCEDURE MonthlySales()
    BEGIN
        SELECT monthname(Date) AS MonthlySales, SUM(OrderValue) AS TotalSales
        FROM customerorders
        GROUP BY Month(Date) with rollup;
    END //

我的输出是:

在此处输入图像描述

标签: mysql

解决方案


如果您的环境/代码对此类结果的处理存在错误,您可以尝试包装查询以将值“推送”到可识别的内容(如果您只想“命名”汇总结果也适用)。

鉴于:

SELECT MONTHNAME(myDate) AS theMonth, SUM(someValue) AS total
FROM aTable 
GROUP BY theMonth WITH ROLLUP
;

改成:

SELECT CASE WHEN theMonth IS NULL THEN 'Year' ELSE theMonth END AS theMonth
   , total
FROM (
   theQueryAbove
) AS q
;

注意:我可以使用IFNULLorCOALESCE代替CASE语句,但该CASE版本有助于扩展多字段分组......

CASE WHEN theMonth IS NULL AND theYear IS NOT NULL THEN 'Year'
WHEN theMonth IS NULL AND theYear IS NULL THEN 'Overall'
ELSE theMonth
END

编辑:如果你想要那么多信息,并且想要保持简洁,你可以这样做COALESCE(theYear, '') AS theYear, COALESCE(theMonth, '') AS theMonth


更明确地说,这是您的特定查询应如下所示:

SELECT CASE WHEN MonthlySales IS NULL THEN 'Year' ELSE MonthlySales END AS MonthlySales
   , TotalSales
FROM (
    SELECT MONTHNAME(Date) AS MonthlySales, SUM(OrderValue) AS TotalSales
    FROM customerorders
    GROUP BY MonthlySales WITH ROLLUP
) AS q
;

推荐阅读