2013-04-08 71 views
0

我有类似的问题,我以前的问题 - Pivot Tables PHP/MySQLPHP SQL Server - 动态表行和列?

在该查询我知道行标题将被调用,只需要动态创建列标题。但是,现在我还不知道行标题。

所以我有一个查询

select eng, count, weekof from dbo.RPT_ENG_WEEK ('2013-03-03', '2013-03-16', '2013-03-03', '2013-03-16') order by eng, weekof asc 

即返回以下数据:

eng  count weekof 
James 11  2013-03-03 
James 12  2013-03-10 
Bill 2  2013-03-03 
Gary 15  2013-03-03 
Gary 5  2013-03-10 
Fred 3  2013-03-03 
Fred 2  2013-03-10 

所以后来我想这变成每一个英行和每样一个weekof列低于

week: 2013-03-03 2013-03-10 
James:  11    12  
Bill:  2    0   
Gary:  15    5    
Fred:  3    2 

我在上一个问题中得到的答案很有魅力,如果我要提名的英文作为静态行,但有可能是100左右eng它可能会返回,并且真的不想手动更新列表!

我可以通过SQL函数中的游标来解决这个问题,但是有没有更好的方法呢?

+0

您的其他问题被标记为MySQL的数据库,这一个是SQL Server,你使用的是什么数据库?这两个版本的代码将会非常不同。 – Taryn 2013-04-08 11:37:59

+2

@bluefeet是的,我知道 - 这是一个来自SQL Server,而不是MySQL(其他查询是) – franglais 2013-04-08 11:38:49

回答

4

将数据从行转换为列被称为PIVOT。由于您使用的是SQL Server,因此您可以使用pivot函数来获取结果。

有几种方法可以做到这一点。如果你有一个已知数量weekof值,那么你可以硬编码查询:

select eng, 
    coalesce([2013-03-03], 0) [2013-03-03], 
    coalesce([2013-03-10], 0) [2013-03-10] 
from 
(
    select eng, [count], weekof 
    from RPT_ENG_WEEK 
) d 
pivot 
(
    sum([count]) 
    for weekof in ([2013-03-03], [2013-03-10]) 
) piv; 

SQL Fiddle with Demo

但如果你有一个未知的数值,那么你将要实行动态SQL得到的结果:

DECLARE @cols AS NVARCHAR(MAX), 
    @colsNull AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(cast(weekof as date)) 
        from RPT_ENG_WEEK 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

select @colsNull = STUFF((SELECT distinct ', coalesce(' + QUOTENAME(cast(weekof as date))+', 0) as '+ QUOTENAME(cast(weekof as date)) 
        from RPT_ENG_WEEK 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT eng, ' + @colsNull + ' 
      from 
      (
       select eng, [count], cast(weekof as date) weekof 
       from RPT_ENG_WEEK 
      ) x 
      pivot 
      (
       sum([count]) 
       for weekof in (' + @cols + ') 
      ) p ' 

execute(@query); 

SQL Fiddle with Demo。两者都给出结果:

| ENG | 2013-03-03 | 2013-03-10 | 
----------------------------------- 
| Bill |   2 |   0 | 
| Fred |   3 |   2 | 
| Gary |   15 |   5 | 
| James |   11 |   12 | 
+0

我确信这是巫术:D绝对的辉煌! – franglais 2013-04-08 11:49:58

+0

@ sam.clements大声笑,这就是为什么我想确认SQL Server或MySQL,代码是难以置信的不同,但你会得到相同的结果。 – Taryn 2013-04-08 11:51:14

+0

对不起,但我怎么才能在PHP中显示呢?通常我会沿着 的方向做一些事情,而($ obj = sqlsrv_fetch_object($ stmt)){0} {0} = $ obj-> eng; $ count = $ obj-> count; 然后显示它,但由于我不知道列标题或行标题,我不确定如何显示它? – franglais 2013-04-08 15:09:09