{
yy=年
mm=月
dd=日
bmbm=商场名
xse销售额
njh=年计划
}CREATE TABLE [dbo].[LS_RXSE] (
[YY] [varchar] (4) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[MM] [varchar] (2) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[DD] [varchar] (2) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[BMBM] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[XSE] [numeric](14, 0) NULL ,
[njh] [numeric] (14, 0)
) insert into LS_RXSE(YY,mm,dd,bmbm,xse,njh) value('2009','01','01','服饰商场',3500,4000)
insert into LS_RXSE(YY,mm,dd,bmbm,xse,njh) value('2009','01','01','手表商场',3532,4300)
insert into LS_RXSE(YY,mm,dd,bmbm,xse,njh) value('2009','01','01','日化商场',2500,3000)
insert into LS_RXSE(YY,mm,dd,bmbm,xse,njh) value('2009','01','01','外贸商场',3520,400)
insert into LS_RXSE(YY,mm,dd,bmbm,xse,njh) value('2009','01','01','家电商场',1002,2003)insert into LS_RXSE(YY,mm,dd,bmbm,xse,njh) value('2008','01','01','服饰商场',3530,4200)
insert into LS_RXSE(YY,mm,dd,bmbm,xse,njh) value('2008,'01','01','手表商场',3430,4030)
insert into LS_RXSE(YY,mm,dd,bmbm,xse,njh) value('2008','01','01','日化商场',2330,300)
insert into LS_RXSE(YY,mm,dd,bmbm,xse,njh) value('2008','01','01','外贸商场',355,300)
insert into LS_RXSE(YY,mm,dd,bmbm,xse,njh) value('2008','01','01','家电商场',302,203)
要求表格如下:
部门 日销售额 去年同期日销售额 年计划 本年截止到现在完成额 去年同期完成额 服饰商场 3500 3530 4000 34344 44444
......
一次类推,
yy=年
mm=月
dd=日
bmbm=商场名
xse销售额
njh=年计划
}CREATE TABLE [dbo].[LS_RXSE] (
[YY] [varchar] (4) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[MM] [varchar] (2) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[DD] [varchar] (2) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[BMBM] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[XSE] [numeric](14, 0) NULL ,
[njh] [numeric] (14, 0)
) insert into LS_RXSE(YY,mm,dd,bmbm,xse,njh) value('2009','01','01','服饰商场',3500,4000)
insert into LS_RXSE(YY,mm,dd,bmbm,xse,njh) value('2009','01','01','手表商场',3532,4300)
insert into LS_RXSE(YY,mm,dd,bmbm,xse,njh) value('2009','01','01','日化商场',2500,3000)
insert into LS_RXSE(YY,mm,dd,bmbm,xse,njh) value('2009','01','01','外贸商场',3520,400)
insert into LS_RXSE(YY,mm,dd,bmbm,xse,njh) value('2009','01','01','家电商场',1002,2003)insert into LS_RXSE(YY,mm,dd,bmbm,xse,njh) value('2008','01','01','服饰商场',3530,4200)
insert into LS_RXSE(YY,mm,dd,bmbm,xse,njh) value('2008,'01','01','手表商场',3430,4030)
insert into LS_RXSE(YY,mm,dd,bmbm,xse,njh) value('2008','01','01','日化商场',2330,300)
insert into LS_RXSE(YY,mm,dd,bmbm,xse,njh) value('2008','01','01','外贸商场',355,300)
insert into LS_RXSE(YY,mm,dd,bmbm,xse,njh) value('2008','01','01','家电商场',302,203)
要求表格如下:
部门 日销售额 去年同期日销售额 年计划 本年截止到现在完成额 去年同期完成额 服饰商场 3500 3530 4000 34344 44444
......
一次类推,
姓名 课程 分数
张三 语文 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 课程
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 参考
标题:普通行列转换(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 ------------------
------------------
本年截止到现在完成额=sum(xse)
如果楼主要想得到结果 请把测试数据先写正确
CREATE TABLE [tb] ( [YY] [varchar] (4) , [MM] [varchar] (2) , [DD] [varchar] (2) , [BMBM] [varchar] (10) , [XSE] [numeric](14, 0) , [njh] [numeric] (14, 0) )
insert into tb(YY,mm,dd,bmbm,xse,njh) values('2009','01','01','服饰商场',3500,4000)
insert into tb(YY,mm,dd,bmbm,xse,njh) values('2009','01','01','手表商场',3532,4300)
insert into tb(YY,mm,dd,bmbm,xse,njh) values('2009','01','01','日化商场',2500,3000)
insert into tb(YY,mm,dd,bmbm,xse,njh) values('2009','01','01','外贸商场',3520,400)
insert into tb(YY,mm,dd,bmbm,xse,njh) values('2009','01','01','家电商场',1002,2003)
insert into tb(YY,mm,dd,bmbm,xse,njh) values('2008','01','01','服饰商场',3530,4200)
insert into tb(YY,mm,dd,bmbm,xse,njh) values('2008','01','01','手表商场',3430,4030)
insert into tb(YY,mm,dd,bmbm,xse,njh) values('2008','01','01','日化商场',2330,300)
insert into tb(YY,mm,dd,bmbm,xse,njh) values('2008','01','01','外贸商场',355,300)
insert into tb(YY,mm,dd,bmbm,xse,njh) values('2008','01','01','家电商场',302,203)
goselect BMBM ,
yy ,
mm ,
dd ,
日销售额 = sum(xse) ,
去年同期日销售额 = isnull((select sum(xse) from tb where bmbm = t.bmbm and yy = cast(cast(t.yy as int) -1 as varchar) and mm = t.mm and dd = t.dd),0),
年计划 = sum(njh),
本年截止到现在完成额 = (select sum(xse) from tb where YY = '2009' and bmbm = t.bmbm and yy+mm+dd<=t.yy+t.mm+t.dd),
去年同期 = (select sum(xse) from tb where YY = cast(cast(t.yy as int) -1 as varchar) and bmbm = t.bmbm and cast(cast(t.yy as int) -1 as varchar)+mm+dd<=cast(cast(t.yy as int) -1 as varchar)+t.mm+t.dd)
from tb t
where YY = '2009'
group by BMBM , yy,mm,dddrop table tb/*
BMBM yy mm dd 日销售额 去年同期日销售额 年计划 本年截止到现在完成额 去年同期
---------- ---- ---- ---- ---------------------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- ----------------------------------------
服饰商场 2009 01 01 3500 3530 4000 3500 3530
家电商场 2009 01 01 1002 302 2003 1002 302
日化商场 2009 01 01 2500 2330 3000 2500 2330
手表商场 2009 01 01 3532 3430 4300 3532 3430
外贸商场 2009 01 01 3520 355 400 3520 355(所影响的行数为 5 行)*/
CREATE TABLE [tb] ( [YY] [varchar] (4) , [MM] [varchar] (4) , [DD] [varchar] (4) , [BMBM] [varchar] (10) , [XSE] [numeric](14, 0) , [njh] [numeric] (14, 0) )
insert into tb(YY,mm,dd,bmbm,xse,njh) values('2009','01','01','服饰商场',3500,4000)
insert into tb(YY,mm,dd,bmbm,xse,njh) values('2009','01','01','手表商场',3532,4300)
insert into tb(YY,mm,dd,bmbm,xse,njh) values('2009','01','01','日化商场',2500,3000)
insert into tb(YY,mm,dd,bmbm,xse,njh) values('2009','01','01','外贸商场',3520,400)
insert into tb(YY,mm,dd,bmbm,xse,njh) values('2009','01','01','家电商场',1002,2003)
insert into tb(YY,mm,dd,bmbm,xse,njh) values('2008','01','01','服饰商场',3530,4200)
insert into tb(YY,mm,dd,bmbm,xse,njh) values('2008','01','01','手表商场',3430,4030)
insert into tb(YY,mm,dd,bmbm,xse,njh) values('2008','01','01','日化商场',2330,300)
insert into tb(YY,mm,dd,bmbm,xse,njh) values('2008','01','01','外贸商场',355,300)
insert into tb(YY,mm,dd,bmbm,xse,njh) values('2008','01','01','家电商场',302,203)
goselect BMBM ,
yy ,
mm ,
dd ,
日销售额 = sum(xse) ,
去年同期日销售额 = isnull((select sum(xse) from tb where bmbm = t.bmbm and yy = cast(cast(t.yy as int) -1 as varchar) and mm = t.mm and dd = t.dd),0),
年计划 = sum(njh),
本年截止到现在完成额 = (select sum(xse) from tb where YY = '2009' and bmbm = t.bmbm and yy+mm+dd<=t.yy+t.mm+t.dd),
去年同期 = (select sum(xse) from tb where YY = cast(cast(t.yy as int) -1 as varchar) and bmbm = t.bmbm and cast(cast(t.yy as int) -1 as varchar)+mm+dd<=cast(cast(t.yy as int) -1 as varchar)+t.mm+t.dd)
from tb t
where YY = '2009'
group by BMBM , yy,mm,dd
union all
select bmbm= '合计',
yy = '合计',
mm = '合计',
dd = '合计',
日销售额 = (select sum(xse) from tb where YY = '2009'),
去年同期日销售额 = (select sum(xse) from tb where YY = cast(cast('2009' as int) -1 as varchar)),
年计划 = (select sum(njh) from tb where YY = '2009'),
本年截止到现在完成额 = (select sum(xse) from tb where YY = '2009'),
去年同期 = (select sum(xse) from tb where YY = cast(cast('2009' as int) -1 as varchar))drop table tb/*
BMBM yy mm dd 日销售额 去年同期日销售额 年计划 本年截止到现在完成额 去年同期
---------- ---- ---- ---- ---------------------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- ----------------------------------------
服饰商场 2009 01 01 3500 3530 4000 3500 3530
家电商场 2009 01 01 1002 302 2003 1002 302
日化商场 2009 01 01 2500 2330 3000 2500 2330
手表商场 2009 01 01 3532 3430 4300 3532 3430
外贸商场 2009 01 01 3520 355 400 3520 355
合计 合计 合计 合计 14054 9947 13703 14054 9947(所影响的行数为 6 行)
*/
如果需要我们帮忙,最好给出完整的表结构,测试数据,计算方法和正确结果.
UP UP UP