MS-SQLServer 2000 T-SQL 交叉報表(行列互換) 交叉查詢 旋轉查詢
阿新 • • 發佈:2019-01-22
在MS-SQLServer 2005 中可以使用pivot運算子來來實現行列轉換. ,但在以下版本中必須使用 case when then else end 語句
下面以學生成績表來舉例:
id姓名 科目 成績
1 張三 語文 60
2 張三 數學 65
3 張三 外語 70
4 李四 語文 80
5 李四 數學 90
6 李四 外語 85
7 王五 語文 70
8 王五 數學 71
9 王五 外語 75
10 趙六 語文 64
11 趙六 數學 67
12 趙六 外語 76
查詢後得出:
姓名 語文數學外語
李四 80 90 85
王五 70 71 75
張三 60 65 70
趙六 64 67 76
準備資料:
select * from sysobjects where [xtype]='u'go
if exists(select id from sysobjects where name='studentscore')
drop table studentscore--刪除與實驗衝突的表go
create table studentscore--建立實驗表(
[id] int identity(1,1),
[name] nvarchar(20) not null,
subject nvarchar(20) not null,
score int not null
)
go
select * from
go
--新增實驗資料insert studentscore values ('張三','語文','60');
insert studentscore values ('張三','數學','65');
insert studentscore values ('張三','外語','70');
insert studentscore values ('李四','語文','80');
insert studentscore values ('李四','數學','90');
insert studentscore values ('李四','外語','85');
insert studentscore values
insert studentscore values ('王五','數學','71');
insert studentscore values ('王五','外語','75');
insert studentscore values ('趙六','語文','64');
insert studentscore values ('趙六','數學','67');
insert studentscore values ('趙六','外語','76');
go
select * from studentscore
go
我們先利用case when then else end 語句將行轉為列:
select [name],語文=case when subject='語文' then score else 0 end from studentscore group by [name],subject,score這裡為了好理解只取一列,得到下面的結果
有了語文成績行專列的例子後,我們很容易將其他兩列也新增進來,
select [name],語文=case
when subject='語文' then score else 0
end,
數學=case
when subject='數學' then score else 0
end,
外語=case
when subject='外語' then score else 0
end
from studentscore
group by [name],subject,score
下面是查詢後的結果:
現在只要把name相同的行合併到一起就ok了,
select [name],語文=max(case
when subject='語文' then score else 0
end),
數學=max(case
when subject='數學' then score else 0
end),
外語=max(case
when subject='外語' then score else 0
end)
from studentscore
group by [name]
好了,看看結果吧.
上面是列數可列舉時的程式碼,很多情況下到底有多少列是動態的或者不可知的.
這個時候需要拼下SQL語句了.
declare @sql varchar(8000)set @sql = 'select [name],'
select @sql = @sql + 'sum(case subject when '''+subject+'''
then score else 0 end) as '''+subject+''','
from (select distinct subject from studentscore) as a
select @sql = left(@sql,len(@sql)-1) + ' from studentscore group by [name]'
print @sql --檢視生成的sql程式碼
exec(@sql)
列印生成的sql程式碼如下:
這個語句還可以再優化些,呵呵.各位大蝦有麼有更好的方案?
end