Как я могу заменить заголовки категории NULL в функции MySQL ROLLUP? - PullRequest
7 голосов
/ 26 июля 2011

Используя запрос MySQL, приведенный ниже, я создал сводную таблицу, которая в точности соответствует тому, что я ищу. Однако я хотел бы заменить значения NULL фактическими описаниями, такими как SubTotal и GrandTotal. Вот формат сводной таблицы, отображаемый в моем выводе PHP (надеюсь, форматирование несколько разборчиво!).

Name    Division 1  Division 2  Division 3  Division 4  Location
Name 1
Name 2
Name 3
NULL    Total       Total       Total       Total
Name 4
Name 5
NULL    Total       etc
NULL    Column Grand Total 

Вот запрос, который я использовал для создания таблицы. После исследования этой проблемы кажется, что функция CASE - это путь. Тем не менее, когда я добавляю две строки CASE в запрос ниже, он, похоже, не работает. Возвращаемое mysql_error говорит, что «функция GROUPING не существует».

SELECT 
CASE WHEN (GROUPING(name)=1) THEN 'MainTotal' ELSE name END AS name, 
CASE WHEN (GROUPING(location)=1) THEN 'SubTotal' ELSE location END AS location, 
name AS Name,
SUM(IF(division='OEM',totalHours,NULL)) AS OEM,
SUM(IF(division='A/M',totalHours,NULL)) AS AM,
SUM(IF(division='SKF',totalHours,NULL)) AS SKF,
SUM(IF(division='RE',totalHours,NULL)) AS RE,
location as Location
FROM $databasetable GROUP BY location, name 
WITH ROLLUP

Кто-нибудь может сказать мне, что я делаю не так? Является ли функция CASE способом замены названий категории NULL?

Заранее спасибо!

Ответы [ 2 ]

12 голосов
/ 26 июля 2011

Попробуй так:

SELECT 
IFNULL(name, 'MainTotal') AS name, 
IFNULL(location, 'SubTotal') AS location, 
SUM(IF(division='OEM',totalHours,NULL)) AS OEM,
SUM(IF(division='A/M',totalHours,NULL)) AS AM,
SUM(IF(division='SKF',totalHours,NULL)) AS SKF,
SUM(IF(division='RE',totalHours,NULL)) AS RE,
location as Location
FROM $databasetable GROUP BY location, name 
WITH ROLLUP
1 голос
/ 02 августа 2016

Я знаю, что этот вопрос довольно старый на данный момент, но результат все еще первый, когда я ищу в Google «mysql с метками свертки».

Ваш ответ использует функцию grouping()не является частью MySQL, но существует аналогичный способ решения вашей проблемы.

Я предполагаю, что вы пытаетесь избежать корректировки вывода из запроса после выполнения.

Попробуйте выполнить следующее:

SELECT
CASE
  WHEN [column1 grouped by] IS NULL THEN "Total"
  ELSE [column1]
END AS `[alias]`,
CASE
  WHEN [column1 grouped by] IS NULL THEN "---"
  ELSE [column2]
END AS `[alias2]`,
SUM(IF([condition1] = [variable], [sum column], 0)) as `[alias3]`
...
FROM [table]
GROUP BY [column1] WITH ROLLUP

Логика здесь заменяет нулевые значения, возвращаемые для сгруппированного столбца, что происходит для последней строки при использовании ROLLUP.Любые дополнительные столбцы, которые не объединены по умолчанию в сводном сводном отчете с последней строкой, возвращенной вашим запросом, за исключением итогов сводных данных.Чтобы избежать этого, вы используете регистр, чтобы проверить, является ли сгруппированный по столбцу ноль, и замените выбранное значение столбца тем, что вы хотите, чтобы оно было возвращено через регистр.

Если вам нужно сделать промежуточные итоги, используйте ту же логику, но настройте отдельные экземпляры запроса и UNION их вместе, чтобы сформировать сводную таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...