1

我有一个包含提交日期和数字的表格。我想使用这样的查询将有序的月份名称显示为分组字段:

SELECT 
  COALESCE(DATE_FORMAT(Day,'%M'), 'TOTAL') As Month,
  SUM(Money) As USD
FROM mytable
WHERE
  Day
    BETWEEN
      concat(date_format(now(),'%Y-'),'01-01')
    AND
      concat(date_format(now(),'%Y-'),'12-31')
GROUP BY
  DATE_FORMAT(Day,'%m') 
  WITH ROLLUP;

我获得:

+----------+--------+
| Month    | USD    |
+----------+--------+
| January  |  103.5 |
| February | 119.25 |
| March    | 163.25 |
| April    |    102 |
| May      | 124.75 |
| June     |   72.5 |
| June     | 685.25 |
+----------+--------+

为什么总计行没有被替换的 NULL 值?

4

1 回答 1

2

问题是您的 GROUP BY 表达式应该与 SELECT 中的表达式相同,因此您会NULL反对您的 TOTAL。您将不得不重写查询。我建议避免使用与 MySQL 关键字和函数名称一致的名称(至少引用它们)。

SELECT
  COALESCE(ELT(m,
               'Jan', 'Feb', 'Mar', 'Apr',
               'May', 'Jun', 'Jul', 'Aug',
               'Sep', 'Oct', 'Nov', 'Dec'),
           'TOTAL') as `Month`,
  USD
FROM (
  SELECT 
    MONTH(`Day`) As m,
    SUM(Money) As USD
  FROM mytable
  WHERE
    `Day`
      BETWEEN
        MAKEDATE(YEAR(CURDATE()), 1)
      AND
        LAST_DAY(MAKEDATE(YEAR(CURDATE()), 365))
  GROUP BY
    MONTH(`Day`) 
    WITH ROLLUP) as sums
于 2012-01-11T08:02:51.567 回答