fra*_*ais 1 php pivot sql-server-2008
我有一个与我之前的问题类似的问题 - 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
Run Code Online (Sandbox Code Playgroud)
返回以下数据:
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
Run Code Online (Sandbox Code Playgroud)
所以我想把它变成每个工程一行和每周一列,如下所示
week: 2013-03-03 2013-03-10
James: 11 12
Bill: 2 0
Gary: 15 5
Fred: 3 2
Run Code Online (Sandbox Code Playgroud)
如果我将 eng 的名称作为静态行放入,那么我在上一个问题中得到的答案会很有魅力,但是它可能会返回 100 个左右的 eng,而且真的不想手动保留更新名单!
我可能可以通过 SQL 函数中的游标来解决这个问题,但是有更好的方法吗?
将数据从行转换为列称为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;
Run Code Online (Sandbox Code Playgroud)
请参阅SQL Fiddle 演示。
但如果您有未知数量的值,那么您将需要实现动态 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);
Run Code Online (Sandbox Code Playgroud)
请参阅SQL Fiddle 演示。两者都给出结果:
| ENG | 2013-03-03 | 2013-03-10 |
-----------------------------------
| Bill | 2 | 0 |
| Fred | 3 | 2 |
| Gary | 15 | 5 |
| James | 11 | 12 |
Run Code Online (Sandbox Code Playgroud)