1

我现有的表是这样的:

ID 授予小计月份
1 孵化 144.56 Nov-2012
2 NIH 240.9 Nov-2012
3 NSF 100.7 Nov-2012
4 其他 276.67 Nov-2012
5 NSF 234.53 Oct-2012
6 DOE 214.35 Oct-2012
7 孵化 321.54 Oct-2012
8 其他 312.35 Oct-2012
9 NSF 156.89 Sep-2012
10 孵化 147.99 Sep-2012
11 其他 245.67 Sep-2012
12 州 148.66 Sep-2012

该表列出了每笔赠款的每月费用。随着时间的推移,行数越来越多。在授权列中,名称大部分时间保持不变。当有新的赠款可用时,它会出现在这里。这种情况并不经常发生。

现在我想将数据绘制成图表,这样人们就可以看到每个月花费了多少资金。为此,我想像这样重塑表格:

ID 月 DOE Hatch NIH NSF 其他州
2012 年 11 月 1 日 144.56 240.9 100.7 276.67  
2012 年 10 月 2 日 214.35 321.54 234.53 312.35  
2012 年 9 月 3 日 147.99 156.89 245.67 148.66

所需的新表保留了 Month 列(distinct),但会将原始表中 Grant 列(distinct)的所有数据值用作列名(动态)。这些新列将 Subtotal 列的相应数据值作为其数据。

有人可以帮助构建查询吗?非常感谢。

顺便说一句:我正在使用 MySQL/PHP。我是新手。任何示例代码都非常感谢。

4

1 回答 1

1

这基本上是一个PIVOT但 MySQL 没有 PIVOT 功能。因此,您将希望使用聚合函数和CASE语句来复制它。如果您知道Grant您拥有的值的数量,那么您可以对查询进行硬编码,如下所示:

select 
  Month,
  sum(case when `grant`='DOE' then subtotal else 0 end) DOE,
  sum(case when `grant`='Hatch' then subtotal else 0 end) Hatch,
  sum(case when `grant`='NIH' then subtotal else 0 end) NIH,
  sum(case when `grant`='NSF' then subtotal else 0 end) NSF,
  sum(case when `grant`='Other' then subtotal else 0 end) Other,
  sum(case when `grant`='State' then subtotal else 0 end) State
from yourtable
group by month

请参阅带有演示的 SQL Fiddle

现在,如果您有未知数量的值Grant,那么您可以使用准备好的语句来生成此查询的动态版本:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(case when `Grant` = ''',
      `Grant`,
      ''' then Subtotal else 0 end) AS `',
      `Grant`, '`'
    )
  ) INTO @sql
FROM yourtable;


SET @sql = CONCAT('SELECT month, ', @sql, ' 
                  FROM yourtable 
                  group by month');


PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

请参阅带有演示的 SQL Fiddle

两者都产生相同的结果:

|    MONTH |  HATCH |   NIH |    NSF |  OTHER |    DOE |  STATE |
-----------------------------------------------------------------
| Nov-2012 | 144.56 | 240.9 |  100.7 | 276.67 |      0 |      0 |
| Oct-2012 | 321.54 |     0 | 234.53 | 312.35 | 214.35 |      0 |
| Sep-2012 | 147.99 |     0 | 156.89 | 245.67 |      0 | 148.66 |
于 2012-11-12T18:36:16.573 回答