【问题标题】:PHP SQL Server - dynamic table rows and columns?PHP SQL Server - 动态表行和列?
【发布时间】:2013-04-08 11:31:18
【问题描述】:

我有一个与我之前的问题类似的问题 - Pivot Tables PHP/MySQL

在那个查询中,我知道会调用行标题并且只需要动态创建列标题。但是,现在我也不知道行标题。

所以我有一个问题

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

所以我想把它变成每英语一行,每周一列,如下所示

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

如果我将 eng 的名称作为静态行放入,我在上一个问题中得到的答案很有魅力,但可能有 100 个左右的 eng 它可以返回并且真的不想拥有手动不断更新列表!

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

【问题讨论】:

  • 您的另一个问题被标记为 MySQL 作为数据库,而这个是 SQL Server,您使用的是什么数据库?两个版本的代码会有很大不同。
  • @bluefeet 是的,我知道 - 这个来自 SQL Server,而不是 MySQL(另一个查询是)

标签: php sql-server-2008 pivot


【解决方案1】:

将数据从行转换为列称为PIVOT。由于您使用的是 SQL Server,那么您可以使用数据透视函数来获取结果。

有几种方法可以做到这一点。如果您有已知数量的 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 |

【讨论】:

  • 我很确定这是伏都教 :D 绝对精彩!
  • @sam.clements LOL,这就是为什么我想确认 SQL Server 或 MySQL,代码非常不同,但你会得到相同的结果。
  • 抱歉出现错误,但我怎样才能在 PHP 中显示它?通常我会按照 while( $obj = sqlsrv_fetch_object( $stmt)) { $eng = $obj->eng; $count = $obj->count;然后显示它,但由于我不知道列标题或行标题,我不确定如何显示它?
  • @sam.clements 我不熟悉 PHP,我的建议是发布一个新问题。
  • 感谢您的帮助 - 很快就会发布一个新问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
相关资源
最近更新 更多