2012-11-12 32 views
1

我现有的表是这样的重建表:SQL查询中使用其动态行数据的列名

 
ID Grant Subtotal  Month 
1 Hatch 144.56   Nov-2012 
2 NIH  240.9   Nov-2012 
3 NSF  100.7   Nov-2012 
4 Other 276.67   Nov-2012 
5 NSF  234.53   Oct-2012 
6 DOE  214.35   Oct-2012 
7 Hatch 321.54   Oct-2012 
8 Other 312.35   Oct-2012 
9 NSF  156.89   Sep-2012 
10 Hatch 147.99   Sep-2012 
11 Other 245.67   Sep-2012 
12 State 148.66   Sep-2012 

表列出每个补助每月的开支。随着时间的推移,行号正在增加。在授权栏内,名称在大部分时间保持不变。当新的赠款可用时,它将出现在这里。这种情况不常发生。

现在我想绘制一张图表的数据,这样人们可以看到每个赠款每个月花了多少钱。为此,我想重塑表是这样的:

 
ID Month   DOE Hatch  NIH  NSF  Other  State 
1 Nov-2012    144.56 240.9 100.7 276.67 
2 Oct-2012  214.35 321.54   234.53 312.35 
3 Sep-2012    147.99   156.89 245.67  148.66 

所需的新表将列月份(不同),但将在原有的表作为使用GRANT柱(不同)的所有数据值列名(动态)。这些新列将列小计的相应数据值作为其数据。

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

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

+1

A“支点”或“交叉”功能,将有助于在这里。您使用的是哪种DBMS系统,因为这些功能是特定于供应商的 – PinnyM

+1

或者,如果您没有可用的“pivot”功能,则可以只进行一堆自我连接(每个聚合列一个)。 – 2012-11-12 18:12:06

+0

我绝不是一个编码器。你们有没有可以提供任何示例代码?谢谢。 –

回答

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 with Demo

现在,如果你有一个未知的数值为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 with Demo

两者产生相同的结果:

| 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 | 
+0

bluefeet,非常感谢你的努力。我在PHPMyAdmin中运行了你的两个代码。第一个给了我这个:月份列:NULL。所有其他列:0.00。您的第二个代码只返回一条消息:您的SQL查询已成功执行。我没有看到表格数据。 –

+0

好的。问题可能是月份列。我将它作为varchar,并将其设置为日期类型。我会再试一次。 –

+0

@JeffLee没有看到你的全表结构很难说这个问题。你是否在你的选择中包含任何其他领域?我无法复制这些问题看到这个演示 - http://sqlfiddle.com/#!2/7f11d/7 – Taryn