【问题标题】:How can I replace NULL category titles in MySQL ROLLUP function?如何替换 MySQL ROLLUP 函数中的 NULL 类别标题?
【发布时间】:2011-10-12 22:53:24
【问题描述】:

使用下面的 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 类别标题的方法吗?

提前致谢!

【问题讨论】:

    标签: php mysql rollup


    【解决方案1】:

    试试这样:

    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
    

    【讨论】:

    • 太完美了。谢谢乔!这似乎也更简单,这对我有用!
    • MySQL 的哪个版本实现了GROUPING
    • 假设您有行,其中位置为 NULL,那么您的 ROLLUP 中将有 NULL 结果。在这种情况下,我添加了一个 COUNT(DISTINCT groupedcolum) AS 变体来分隔总计行(计数 > 1)和实际 NULL 行(计数为 0)
    【解决方案2】:

    我知道这个问题现在已经很老了,但是当我在 Google 上搜索“带有汇总标签的 mysql”时,结果仍然是第一个返回的。

    您的回复使用了不属于 MySQL 的 grouping() 函数,但有类似的方法可以解决您的问题。

    我假设您试图避免在执行后调整查询的输出。

    尝试以下方法:

    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 一起形成您的数据透视表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多