我的表格带有列:
[Date] [Name] [Result]
2010-01-01 Name01 11
2010-01-01 Name02 22
2010-07-04 Name01 32
2010-07-04 Name02 54
我正在处理SELECT语句,它给我这样的结果:
[Name] [2010-01-01] [2010-07-04]
Name01 11 32
Name02 22 54
我已经尝试过PIVOT功能,但是它不起作用。
选择*从(
SELECT Date,Name,Result
FROM tbl_Results
WHERE (..conditions..)
)
PIVOT (
Result FOR Date in
([1],[2],[3],[2],[5])
)
错误消息
关键字“ PIVOT”附近的语法不正确。
这是SQL Server 2005,我不确定PIVOT是否可用?
也许使用任何其他功能?
我也不知道如何将select中的列名设置为日期。
感谢您提供所有答案。问题是我不知道结果中将有多少列。因此,我无法使用固定日期值,例如“ 2010-07-04”。日期在表中的语句中“即时使用”。
答案 0 :(得分:2)
只需使用条件聚合:
select name,
max(case when date = '2010-01-01' then result end) as result_20100101,
max(case when date = '2010-07-04' then result end) as result_20100704
from tbl_results
where . . .
group by name;
然后将系统升级到支持的数据库。
答案 1 :(得分:1)
我在您的更新中看到,您将需要动态SQL。这是一个存储过程,几乎可以透视任何表或即席查询。还有一个用于创建其他行聚合的附加实用程序
示例
Exec [prc-Pivot] '#YourTable','Date','sum([Result])[]','Name','count(*)[Records],min(Result)[MinValue],max(Result)[MaxValue]'
或简单
Exec [prc-Pivot] '#YourTable','Date','sum([Result])[]','Name',null
返回
存储过程
CREATE PROCEDURE [dbo].[prc-Pivot] (
@Source varchar(1000), -- Any Table or Select Statement
@PvotCol varchar(250), -- Field name or expression ie. Month(Date)
@Summaries varchar(250), -- aggfunction(aggValue)[optionalTitle]
@GroupBy varchar(250), -- Optional additional Group By
@OtherCols varchar(500) ) -- Optional Group By or aggregates
AS
Set NoCount On
Set Ansi_Warnings Off
Declare @Vals varchar(max),@SQL varchar(max);
Set @Vals = ''
Set @OtherCols= IsNull(', ' + @OtherCols,'')
Set @Source = case when @Source Like 'Select%' then @Source else 'Select * From '+@Source end
Create Table #TempPvot (Pvot varchar(100))
Insert Into #TempPvot
Exec ('Select Distinct Convert(varchar(100),' + @PvotCol + ') as Pvot FROM (' + @Source + ') A')
Select @Vals = @Vals + ', isnull(' + Replace(Replace(@Summaries,'(','(CASE WHEN ' + @PvotCol + '=''' + Pvot + ''' THEN '),')[', ' END),0) As [' + Pvot ) From #TempPvot Order by Pvot
Drop Table #TempPvot
Set @SQL = Replace('Select ' + Isnull(@GroupBy,'') + @OtherCols + @Vals + ' From (' + @Source + ') PvtFinal ' + case when Isnull(@GroupBy,'')<>'' then 'Group By ' + @GroupBy + ' Order by ' + @GroupBy else '' end,'Select , ','Select ')
--Print @SQL
Exec (@SQL)
Set NoCount Off
Set Ansi_Warnings on
答案 2 :(得分:0)
试试这个-
SELECT * FROM
(
SELECT A.Name,A.Date,A.Result
FROM your_table A
--WHERE A.Name = 'Name01'
) A
PIVOT
(
SUM(Result)
FOR Date IN ([2010-01-01],[2010-07-04])
)PVT