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サーバーのピボットテーブルについて知っていますが、正確に欲しいものに近い結果をもたらすものを書くことはできません

4

2 に答える 2

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 フィドル

于 2012-10-03T05:37:02.297 に答える
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
于 2012-10-03T08:22:10.717 に答える