8

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

提前致谢!

4

2 回答 2

16

试试这样:

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
于 2011-07-25T21:45:03.890 回答
2

我知道这个问题在这一点上已经很老了,但是当我在谷歌搜索“带有汇总标签的 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它们组合在一起以形成您的数据透视表。

于 2016-08-02T16:48:02.713 回答