天天看點

資料庫-行轉列的文法

表: 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