表: PerTab
字段:name, title, values
原内容:一月 産品A 120
二月 産品A 20
一月 産品B 230
二月 産品B 400
-----------------------------------------------
查詢結果: 月份 産品A 産品B 數量(Values)
一月 120 230
二月 20 400
-----------------------------------------------
SQl文法:select name, sum(case title when '産品A' then values else 0 end ) as 産品A from PerTab group by name
備注: 其中中間的可以重複,得到所有的列
還可以用這樣的SQL語句:
select p1.name,sum(p1.values) as 産品 A,sum(p2.values) as 産品B from pertab p1,pertab p2 where p1.name=p2.name and p1.ti
tle='産品A' and p2.title='産品B' group by name;
*****************************************************
可以自動生成的語句(摘錄中國DOtNet)
declare @sql varchar(8000)
set @sql = 'select name'
select @sql = @sql + ',sum(case title when '''+title+''' then values end) ['+title+']'
from (select distinct title from PerTab) as a
select @sql = @sql+' from PerTabgroup by name'
exec(@sql)
******************************************************
曆史資料
declare @sql varchar(8000)
set @sql = 'select dt,qcode'
select @sql = @sql + ',sum(case [pid] when '''+cast([pid] as nvarchar)+''' then [val] end) as [' + cast(pid AS nvarchar) + ']'
from (select distinct pid from T20060411_60min WHERE PID IN(1,2,3,7,8,9,15,20)) as a
select @sql = @sql+' from T20060411_60min group by dt,qcode'
print @sql
exec(@sql)
********************************************************************************************************
寫出這個SQL語句!
create table student
(
stuNo int,
stuName varchar(20)
);
create table cg
(
stuNo int,
course varchar(20),
result int
);
alter table cg add constraint foreign key (stuNo) references student(stuNo);
insert into student values(1,'a');
insert into student values(2,'b');
insert into cg values(1,'english',50);
insert into cg values(1,'chinese',60);
insert into cg values(2,'english',57);
insert into cg values(2,'chinese',68);
/ lect * from student
stuNo stuName
1 aa
2 bb
/ lect * from cg
stuNo course result
1 Chinese 80
1 English 92
2 Chinese 75
2 English 86
//隻是随便寫的兩個表,通過stuNo關聯,上面那個表是主表,下面的是引用表
//大概意思就這樣,
//要求顯示效果如下:
stuNo stuName Englist Chinese total
1 aa 80 92 172
1 bb 75 86 161
星域鎖定<[email protected]> 21:07:56
select s.stuno as stuNo, s.stuName as stuName,
c1.result as english, c2.result as chinese,
(c1.result+c2.result) as total from
cg c1 inner join cg c2 on c1.stuno=c2.stuno inner
join student s on c1.stuno=s.stuno where
c1.course='english' and c2.course='chinese';
==================================================================
select sum(decode(sj1,'A', 1,0)) "A",
sum(decode(sj1,'B', 1,0)) "B",
sum(decode(sj1,'C', 1,0)) "C",
sum(decode(sj1,'D', 1,0)) "D",
sum(decode(sj1,'E', 1,0)) "E",
from TABLE
=================================================================
姓名 課程 分數
---- ---- ----
張三 國文 74
張三 數學 83
張三 實體 93
李四 國文 74
李四 數學 84
李四 實體 94
結果:
姓名 國文 數學 實體
---- ---- ---- ----
李四 74 84 94
張三 74 83 93
-------------------
create table tb(姓名 varchar(10) , 課程 varchar(10) , 分數 int)
insert into tb values('張三' , '國文' , 74)
insert into tb values('張三' , '數學' , 83)
insert into tb values('張三' , '實體' , 93)
insert into tb values('李四' , '國文' , 74)
insert into tb values('李四' , '數學' , 84)
insert into tb values('李四' , '實體' , 94)
--SQL SERVER 2000 靜态SQL,指課程隻有國文、數學、實體這三門課程。(以下同)
select 姓名 as 姓名 ,
max(case 課程 when '國文' then 分數 else 0 end) 國文,
max(case 課程 when '數學' then 分數 else 0 end) 數學,
max(case 課程 when '實體' then 分數 else 0 end) 實體
from tb
group by 姓名
上面這條查詢語句在DB2中也适用,本人驗證過.//
--SQL SERVER 2000 動态SQL,指課程不止國文、數學、實體這三門課程。(以下同)
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 課程 when ''' + 課程 + ''' then 分數 else 0 end) [' + 課程 + ']'
from (select distinct 課程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql)
--SQL SERVER 2005 靜态SQL。
select * from (select * from tb) a pivot (max(分數) for 課程 in (國文,數學,實體)) b
--SQL SERVER 2005 動态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + 課程 from tb group by 課程
set @sql = '[' + @sql + ']'
exec ('select * from (select * from tb) a pivot (max(分數) for 課程 in (' + @sql + ')) b')
轉自:http://blog.sina.com.cn/s/blog_5f8d04170100qkfv.html