select F1,F2,F3 from tb where ...F1 根据条件xxx得到
F2 根据条件yyy得到
F3 根据条件zzz得到xxx、yyy、zzz 是where...后面的条件,但这些条件不能同时存在
这样的情况,怎么做?
F2 根据条件yyy得到
F3 根据条件zzz得到xxx、yyy、zzz 是where...后面的条件,但这些条件不能同时存在
这样的情况,怎么做?
解决方案 »
- 关于分割查询的问题
- 朋友列表的难题,高手帮帮忙
- where 主键 in (1,2,3...7,8,9)and 主键 not in (4,5,6)有没有更有效的表示方法?
- 求加条件更新的sql语句!!!!!!!!
- 求助,错误"已禁用对分布式事务管理器(MSDTC)的网络访问"
- 求教Sql语句
- 模拟器访问数据库 数据访问失败
- sql 行列转换
- SQL排序(规则12304)
- SELECT TOP 3 WHIT TIES 中 "WHIT TIES" 是什么意思 .
- 在asp中做站内搜索,要同时搜索多张表,a,b,c,d,且各表中的字段都一样,如何将这些表连接起来同时搜索
- 关于ajax直接调用sql的虚拟web
from tb a join tb b on a.id=b.id
join tb c on a.id=c.id
where a.xxx and b.yyy and c.zzz
select
(select F1 from tb where xxxx) as f1,
(select F1 from tb where yyyy) as f2,
(select F1 from tb where zzzz) as f3
select
(select colfrom tb where xxxx) as f1,
(select col from tb where yyyy) as f2,
(select col from tb where zzzz) as f3
select
(select F1 from tb where xxxx) as f1,
(select F1 from tb where yyyy) as f2,
(select F1 from tb where zzzz) as f3如果是多条,且f1,f2,f3类型一样,使用union all
select 'F1' col1 , F1 col2 from tb where xxxx
union all
select 'F2' col1 , F2 col2 from tb where yyyy
union all
select 'F3' col1 , F3 col2 from tb where zzzz
如果非要显示在一行上.select m1.f1 , m1.f2 , m2.f3 from
(
select isnull(t1.px , t2.px) px , t1.f1 , t2.f2 from
(select f1 , px = (select count(1) from (select F1 from tb where xxxx) n where f1 < m.f1) + 1 from (select F1 from tb where xxxx) m) t1 full join
(select f2 , px = (select count(1) from (select F2 from tb where yyyy) n where f2 < m.f2) + 1 from (select F2 from tb where yyyy) m) t2 on t1.px = t2.px
) m1
full join
(
select f3 , px = (select count(1) from (select F3 from tb where zzzz) n where f3 < m.f3) + 1 from (select F3 from tb where zzzz) m
) m2
on m1.px = m2.px
公司名 衣服(件数) 裙子(件数) 裤子(件数)
公司1 100 50 100
公司2 100 100 150
公司3 150 200 30其中,字段“衣服件数”,是根据 where 产品分类 = '衣服' 得来
字段“裙子件数”,是根据 where 产品分类 = '裙子' 得来
字段“裤子件数”,是根据 where 产品分类 = '裤子' 得来
标题:普通行列转换(version 2.0)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-03-09
地点:广东深圳
说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 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)
go--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 姓名--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')---------------------------------/*
问题:在上述结果的基础上加平均分,总分,得到如下结果:
姓名 语文 数学 物理 平均分 总分
---- ---- ---- ---- ------ ----
李四 74 84 94 84.00 252
张三 74 83 93 83.33 250
*/--SQL SERVER 2000 静态SQL。
select 姓名 姓名,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理,
cast(avg(分数*1.0) as decimal(18,2)) 平均分,
sum(分数) 总分
from tb
group by 姓名--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 + ' , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名'
exec(@sql) --SQL SERVER 2005 静态SQL。
select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b) m,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
exec ('select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b) m ,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名')drop table tb ------------------
------------------/*
问题:如果上述两表互相换一下:即表结构和数据为:
姓名 语文 数学 物理
张三 74 83 93
李四 74 84 94
想变成(得到如下结果):
姓名 课程 分数
---- ---- ----
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93
--------------
*/create table tb(姓名 varchar(10) , 语文 int , 数学 int , 物理 int)
insert into tb values('张三',74,83,93)
insert into tb values('李四',74,84,94)
go--SQL SERVER 2000 静态SQL。
select * from
(
select 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 , 课程 = '物理' , 分数 = 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 end--SQL SERVER 2000 动态SQL。
--调用系统表动态生态。
declare @sql varchar(8000)
select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [课程] = ' + quotename(Name , '''') + ' , [分数] = ' + quotename(Name) + ' from tb'
from syscolumns
where name! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名为姓名的其它列
order by colid asc
exec(@sql + ' order by 姓名 ')--SQL SERVER 2005 动态SQL。
select 姓名 , 课程 , 分数 from tb unpivot (分数 for 课程 in([语文] , [数学] , [物理])) t--SQL SERVER 2005 动态SQL,同SQL SERVER 2000 动态SQL。--------------------
/*
问题:在上述的结果上加个平均分,总分,得到如下结果:
姓名 课程 分数
---- ------ ------
李四 语文 74.00
李四 数学 84.00
李四 物理 94.00
李四 平均分 84.00
李四 总分 252.00
张三 语文 74.00
张三 数学 83.00
张三 物理 93.00
张三 平均分 83.33
张三 总分 250.00
------------------
*/select * from
(
select 姓名 as 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 as 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 as 姓名 , 课程 = '物理' , 分数 = 物理 from tb
union all
select 姓名 as 姓名 , 课程 = '平均分' , 分数 = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb
union all
select 姓名 as 姓名 , 课程 = '总分' , 分数 = 语文 + 数学 + 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 enddrop table tb
F3 是表 tb2 的要将 F1,F2,F3 合并放在一张表里,也就是F3水平合并到F1,F2的后面。