{
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
......
一次类推,

解决方案 »

  1.   

    问题:假设有张学生成绩表(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 课程 
    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 参考
      

  2.   

    *
    标题:普通行列转换(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    ------------------
    ------------------
      

  3.   

    去年同期日销售额  需要联合年月日来计算 用dateadd(yy,-1,'2009-01-01')这样
    本年截止到现在完成额=sum(xse)
    如果楼主要想得到结果 请把测试数据先写正确
      

  4.   

    不需要存储过程,直接SQL语句即可.
    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 行)*/
      

  5.   

    合计行,可能要用UNION ALL来
      

  6.   

    --这是我的理解,不知道对不对?
    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 行)
    */
      

  7.   


    如果需要我们帮忙,最好给出完整的表结构,测试数据,计算方法和正确结果. 
    UP UP UP