NULL не генерируется в последней строке запроса GROUP BY WITH ROLLUP - PullRequest
1 голос
/ 11 января 2012

У меня есть таблица с датой и номером. Я хочу отображать упорядоченные названия месяцев в виде группирующих полей с помощью запроса, подобного следующему:

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, которое подставляется?

1 Ответ

2 голосов
/ 11 января 2012

Проблема в том, что ваше выражение GROUP BY должно быть таким же, как и выражение в SELECT, поэтому у вас будет NULL против вашего ИТОГО.Вам придется переписать запрос.И я бы посоветовал избегать имен, которые совпадают с ключевыми словами 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
...