2012-08-16 57 views
0

我发现这个链接Pivot tables in SQL Server. A simple sample.并做了一个转换到临时表。但是,我得到了一个错误。 “附近有语法错误 '('” 你能不能帮我在这下面是代码:?!无法透视表

IF OBJECT_ID('tempdb..#DailyIncome') IS NOT NULL 
BEGIN 
drop table #DailyIncome 
END 

create table #DailyIncome 
     (
     VendorId nvarchar(10) 
     , IncomeDay nvarchar(10) 
     , IncomeAmount int 
     ) 

insert into #DailyIncome values ('SPIKE', 'FRI', 100) 
insert into #DailyIncome values ('SPIKE', 'MON', 300) 
insert into #DailyIncome values ('FREDS', 'SUN', 400) 
insert into #DailyIncome values ('SPIKE', 'WED', 500) 
insert into #DailyIncome values ('SPIKE', 'TUE', 200) 
insert into #DailyIncome values ('JOHNS', 'WED', 900) 
insert into #DailyIncome values ('SPIKE', 'FRI', 100) 
insert into #DailyIncome values ('JOHNS', 'MON', 300) 
insert into #DailyIncome values ('SPIKE', 'SUN', 400) 
insert into #DailyIncome values ('JOHNS', 'FRI', 300) 
insert into #DailyIncome values ('FREDS', 'TUE', 500) 
insert into #DailyIncome values ('FREDS', 'TUE', 200) 
insert into #DailyIncome values ('SPIKE', 'MON', 900) 
insert into #DailyIncome values ('FREDS', 'FRI', 900) 
insert into #DailyIncome values ('FREDS', 'MON', 500) 
insert into #DailyIncome values ('JOHNS', 'SUN', 600) 
insert into #DailyIncome values ('SPIKE', 'FRI', 300) 
insert into #DailyIncome values ('SPIKE', 'WED', 500) 
insert into #DailyIncome values ('SPIKE', 'FRI', 300) 
insert into #DailyIncome values ('JOHNS', 'THU', 800) 
insert into #DailyIncome values ('JOHNS', 'SAT', 800) 
insert into #DailyIncome values ('SPIKE', 'TUE', 100) 
insert into #DailyIncome values ('SPIKE', 'THU', 300) 
insert into #DailyIncome values ('FREDS', 'WED', 500) 
insert into #DailyIncome values ('SPIKE', 'SAT', 100) 
insert into #DailyIncome values ('FREDS', 'SAT', 500) 
insert into #DailyIncome values ('FREDS', 'THU', 800) 
insert into #DailyIncome values ('JOHNS', 'TUE', 600) 

SELECT * FROM #DailyIncome 

SELECT * 
FROM #DailyIncome 
pivot(avg(IncomeAmount) FOR IncomeDay IN (
     [MON] 
     ,[TUE] 
     ,[WED] 
     ,[THU] 
     ,[FRI] 
     ,[SAT] 
     ,[SUN] 
     )) AS AvgIncomePerDay 

谢谢你们

[更新]

根据该意见,使用SQL Server 2000中创建的数据库是否有此解决方法?

+2

SQL Server的版本是否运行了? – 2012-08-16 04:07:35

+0

我刚刚在2008年,2005年和2000年运行过,并且只在2000年失败。您会从链接中注意到PIVOT仅在2005年可用http://msdn.microsoft.com/zh-cn/library/ms177410 (v = sql.105).aspx,所以请运行SELECT @@ VERSION来检查它是哪个版本。 – 2012-08-16 04:11:28

+0

@ Musikero31,你的上面的代码对我来说工作正常..我在2005年执行了这个 – SuganR 2012-08-16 04:12:05

回答

0

你可以尝试像

SELECT VendorId, 
     AVG(CASE 
      WHEN IncomeDay = 'MON' 
       THEN IncomeAmount 
      ELSE NULL 
     END) [MON], 
     AVG(CASE 
      WHEN IncomeDay = 'TUE' 
       THEN IncomeAmount 
      ELSE NULL 
     END) [TUE], 
     AVG(CASE 
      WHEN IncomeDay = 'WED' 
       THEN IncomeAmount 
      ELSE NULL 
     END) [WED], 
     AVG(CASE 
      WHEN IncomeDay = 'THU' 
       THEN IncomeAmount 
      ELSE NULL 
     END) [THU], 
     AVG(CASE 
      WHEN IncomeDay = 'FRI' 
       THEN IncomeAmount 
      ELSE NULL 
     END) [FRI], 
     AVG(CASE 
      WHEN IncomeDay = 'SAT' 
       THEN IncomeAmount 
      ELSE NULL 
     END) [SAT], 
     AVG(CASE 
      WHEN IncomeDay = 'SUN' 
       THEN IncomeAmount 
      ELSE NULL 
     END) [SUN] 
FROM #DailyIncome 
GROUP BY VendorId 

请注意,我使用NULLS而不是0的原因是由于PIVOT功能。

Using PIVOT and UNPIVOT

当聚集函数与PIVOT使用

,任何空的存在在值列 值不被计算的 聚合时考虑。

如果你用0,而不是空值

+0

当然,关于聚合和空值的注释在pivot操作之外也是真实的。 – shawnt00 2012-08-16 04:38:03

0

枢轴是更清洁,更少的代码运行查询,你会发现不同的结果。语法只是一点点。试试这个你最后陈述时,它包装的声明在SELECT子句:

SELECT * FROM 
(
SELECT * 
FROM #DailyIncome 
)Data 
pivot(avg(IncomeAmount) FOR IncomeDay IN (
     [MON] 
    ,[TUE] 
    ,[WED] 
    ,[THU] 
    ,[FRI] 
    ,[SAT] 
    ,[SUN] 
    )) 

AS AvgIncomePerDay