2012-10-03 32 views
1

得到聚集,這是我的基本表:透視表和多個參數

Region year carsSold bicyclesSold 
RegX 1999  50   100 
RegX 2000  150   30 
RegY 1998  60   40 

我想吃點什麼,結果是:

Region Year   1998 1999 2000 
RegX carsSold   0 50 150 
     bicyclesSold  0 100 30 
RegY carsSold  60 0 0 
     bicyclesSold 40 0 0 

有沒有辦法做到這一點的SQL服務器?有沒有辦法在Excel中做到這一點?這種數據呈現的最佳解決方案是什麼?你能建議任何適合於此的軟件嗎?

我知道SQL Server中樞軸表,但不能寫任何東西你怎麼會這樣的結果緊挨什麼excactly我想

+0

您需要格式化您的樣本數據。我無法理解。 –

回答

3
select P.Region, 
     P.Item, 
     isnull(P.[1998], 0) as [1998], 
     isnull(P.[1999], 0) as [1999], 
     isnull(P.[2000], 0) as [2000] 
from YourTable 
unpivot (ItemsSold for Item in (carsSold, bicyclesSold)) as U 
pivot (sum(ItemsSold) for year in ([1998], [1999], [2000])) as P 
order by P.Region, P.Item 

SQL Fiddle

+0

好吧,如果有ALO列的子區域,但我想總結區域結果如圖所示做什麼? – gruber

+0

@gruber不確定你的意思。你應該問這是一個新的問題,因爲這是封閉的,出於某種原因。 –

1

作爲替代,只有ANSI-92兼容的代碼。你甚至可以在SQLite中運行它,除了關於方括號列名的部分。

我把你字面上當你說exactly what I want

select 
    case when veh.iscar=1 then t.region else '' end Region, 
    veh.type [Year], 
    max(case when t.year = 1998 
     then carsSold*iscar + bicyclesSold*(1-iscar) else 0 end) [1998], 
    max(case when t.year = 1999 
     then carsSold*iscar + bicyclesSold*(1-iscar) else 0 end) [1999], 
    max(case when t.year = 2000 
     then carsSold*iscar + bicyclesSold*(1-iscar) else 0 end) [2000] 
from YourTable t 
cross join (
    select 'carsSold',1 union all 
    select 'bicyclesSold',0) veh(type,iscar) 
group by t.region, veh.type, veh.iscar 
order by t.region, type desc; 

>> 
Region Year   1998 1999 2000 
RegX carsSold  0 50  150 
     bicyclesSold 0 100  30 
RegY carsSold  60 0  0 
     bicyclesSold 40 0  0