SQLServer 2005でPivotを使用して行列変換で発生した問題
1.テーブル・スクリプトの作成
if exists (select 1
from sysobjects
where id = object_id('Insurances')
and type = 'U')
drop table Insurances
go
/*==============================================================*/
/* Table: Insurances */
/*==============================================================*/
create table Insurances (
RefID uniqueidentifier not null,
HRMS nvarchar(20) null,
Name nvarchar(20) null,
InsuranceMoney money null,
InsuranceName nvarchar(100) not null,
constraint PK_INSURANCES primary key (RefID)
)
go
2.テストデータスクリプト
Insert into Insurances values(newid(),'張三',200,'養老保険')
Insert into Insurances values(newid(),'張三',300,'医療保険')
Insert into Insurances values(newid(),'李四',250,'養老保険')
Insert into Insurances values(newid(),'李四',350,'医療保険')
Insert into Insurances values(newid(),'王二',150,'養老保険')
Insert into Insurances values(newid(),'王二',300,'医療保険')
3.クエリー表データ
select HRMS,Name,InsuranceMoney,InsuranceName From Insurances
HRMS Name InsuranceMoney InsuranceName
-------------------- -------------------- --------------------- ----------
1枚三200.00養老保険
2李四350.00医療保険
2李四250.00養老保険
1枚300.00医療保険
3王二300.00医療保険
3王二150.00養老保険
4.転置テーブルデータ
select * from
(
select HRMS,Name,InsuranceMoney,InsuranceName from Insurances
) p
Pivot (
sum(InsuranceMoney)
FOR InsuranceName IN
([医療保険],[養老保険])
as pvt
HRMS Name医療保険養老保険
-------------------- -------------------- --------------------- ---------------------
2李四350.00 250.00
3王二300.00 150.00
1枚3 300.00 200.00
声明:以上のテストデータはインターネットから来て、重点的に以下のエラーの解決方法を提示することを強調します
http://www.cnblogs.com/icebutterfly/archive/2009/08/07/1541322.html
4の文を実行すると、エラーメッセージが表示されます.
「Pivot」の近くに文法の間違いがあります.この機能を有効にするには、現在のデータベースの互換性レベルをより高い値に設定する必要があります.ストレージ・プロシージャsp_についてdbcmptlevelの詳細については、ヘルプを参照してください.
解決策:
現在のデータベースの互換性レベルをより高い値に設定する必要があります.デフォルトは80、90です.
現在のデータベースの互換性レベルを表示するには、現在のデータベースを右クリックします.
if exists (select 1
from sysobjects
where id = object_id('Insurances')
and type = 'U')
drop table Insurances
go
/*==============================================================*/
/* Table: Insurances */
/*==============================================================*/
create table Insurances (
RefID uniqueidentifier not null,
HRMS nvarchar(20) null,
Name nvarchar(20) null,
InsuranceMoney money null,
InsuranceName nvarchar(100) not null,
constraint PK_INSURANCES primary key (RefID)
)
go
2.テストデータスクリプト
Insert into Insurances values(newid(),'張三',200,'養老保険')
Insert into Insurances values(newid(),'張三',300,'医療保険')
Insert into Insurances values(newid(),'李四',250,'養老保険')
Insert into Insurances values(newid(),'李四',350,'医療保険')
Insert into Insurances values(newid(),'王二',150,'養老保険')
Insert into Insurances values(newid(),'王二',300,'医療保険')
3.クエリー表データ
select HRMS,Name,InsuranceMoney,InsuranceName From Insurances
HRMS Name InsuranceMoney InsuranceName
-------------------- -------------------- --------------------- ----------
1枚三200.00養老保険
2李四350.00医療保険
2李四250.00養老保険
1枚300.00医療保険
3王二300.00医療保険
3王二150.00養老保険
4.転置テーブルデータ
select * from
(
select HRMS,Name,InsuranceMoney,InsuranceName from Insurances
) p
Pivot (
sum(InsuranceMoney)
FOR InsuranceName IN
([医療保険],[養老保険])
as pvt
HRMS Name医療保険養老保険
-------------------- -------------------- --------------------- ---------------------
2李四350.00 250.00
3王二300.00 150.00
1枚3 300.00 200.00
声明:以上のテストデータはインターネットから来て、重点的に以下のエラーの解決方法を提示することを強調します
http://www.cnblogs.com/icebutterfly/archive/2009/08/07/1541322.html
4の文を実行すると、エラーメッセージが表示されます.
「Pivot」の近くに文法の間違いがあります.この機能を有効にするには、現在のデータベースの互換性レベルをより高い値に設定する必要があります.ストレージ・プロシージャsp_についてdbcmptlevelの詳細については、ヘルプを参照してください.
解決策:
現在のデータベースの互換性レベルをより高い値に設定する必要があります.デフォルトは80、90です.
EXEC sp_dbcmptlevel ' ', 90
現在のデータベースの互換性レベルを表示するには、現在のデータベースを右クリックします.