2012-08-16 35 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