select a.id,flynn_code,b.name  as flynn_name,sum(pt) as total
from ivy  a
left join flynn  b on a.flynn_code = b.code
group by a.id,a.flynn_code,b.name

解决方案 »

  1.   

    。。没有月份对应的,这个不算哦,这个很简单的。。表的需求格式是:
      
    _________________________________________________________________________
    id   |  code  |   name |  total    |            使用分派                   |
                                       --------------------------------------
    ..   |   ..   |        |           | 1月| 2月|      ...            |12月 |
    _________________________________________________________________________
     .   |     2  |   泥土  |     75    |       25   25           25          |
    _________________________________________________________________________画的不要,但应该能理解。!
      

  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    ------------------
    ------------------/*
    问题:如果上述两表互相换一下:即表结构和数据为:
    姓名 语文 数学 物理
    张三 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
    ------------------
    */
      

  3.   

    select 
      a.id,
      flynn_code,
      b.name  as flynn_name,
      sum(pt) as total
    from 
      ivy  a
    left join 
      flynn  b 
    on 
      a.flynn_code = b.code
    group by 
      a.id,a.flynn_code,b.name
      

  4.   

    Style沒辦法把泥土0,1分開,至少還少1個關聯把
      

  5.   

    use tempdb
    if object_id('ivy') is not null
    drop table ivy
    if object_id('flynn') is not null
    drop table flynn
    go
    create table ivy (id int,flynn_pkid int,flynn_code int,date datetime,pt int) 
    goinsert into ivy values(1,1,2,'2009-05-13',25) 
    insert into ivy values(2,1,1,'2009-06-13',25) 
    insert into ivy values(4,2,4,'2009-08-13',25) 
    insert into ivy values(6,2,2,'2009-09-13',25) 
    insert into ivy values(7,2,2,'2009-12-13',25) 
    gocreate table flynn (pkid int,code int,name varchar(10),style int) 
    goinsert into flynn values(1,1,'煤炭',0) 
    insert into flynn values(2,4,'石油',0) 
    insert into flynn values(3,2,'泥土',0) 
    insert into flynn values(4,2,'泥土',1) select a.id,a.flynn_code,b.name,sum(a.pt) as total,
    (case month(a.date) when 5 then sum(a.pt) else 0 end)
     as '五月份',
    (case month(a.date) when 9 then sum(a.pt) else 0 end)
     as '九月份',
    (case month(a.date) when 10 then sum(a.pt) else 0 end)
     as '十月份'from ivy as a left join flynn as b on a.flynn_pkid=b.pkid and a.flynn_code=b.code
    group by a.id,a.flynn_code,b.name,a.date
    没太明白你的要求,这样是不是可以?
    另外,你的源码中,插入日期没有'',我加上了
      

  6.   

    create table #ivy (id int,flynn_pkid int,flynn_code int,date datetime,pt int) insert into #ivy values(1,1,2,'2009-05-13',25) 
    insert into #ivy values(2,1,1,'2009-06-13',25) 
    insert into #ivy values(4,2,4,'2009-08-13',25) 
    insert into #ivy values(6,2,2,'2009-09-13',25) 
    insert into #ivy values(7,2,2,'2009-12-13',25) create table #flynn (pkid int,code int,name varchar(10),style int) insert into #flynn values(1,1,'煤炭',0) 
    insert into #flynn values(2,4,'石油',0) 
    insert into #flynn values(3,2,'泥土',0) 
    insert into #flynn values(4,2,'泥土',1)  select aa.name,aa.Style,aa.flynn_pkid,sum(aa.pt) as total,
    one=Sum(case DATEPART(month,aa.date) when 1 then aa.pt  else 0 end),
    two=Sum(case DATEPART(month,aa.date) when 2 then aa.pt  else 0 end)
    three=Sum(case DATEPART(month,aa.date) when 3 then aa.pt  else 0 end),
    foure=Sum(case DATEPART(month,aa.date) when 4 then aa.pt  else 0 end),
    wuyue=Sum(case DATEPART(month,aa.date) when 5 then aa.pt  else 0 end),
    liuyue=Sum(case DATEPART(month,aa.date) when 6 then aa.pt  else 0 end),
    qiyue=Sum(case DATEPART(month,aa.date) when 7 then aa.pt  else 0 end),
    bayue=Sum(case DATEPART(month,aa.date) when 8 then aa.pt  else 0 end),
    jiuyue=Sum(case DATEPART(month,aa.date) when 9 then aa.pt  else 0 end),
    shiyue=Sum(case DATEPART(month,aa.date) when 10 then aa.pt  else 0 end),
    shiyi=Sum(case DATEPART(month,aa.date) when 11 then aa.pt  else 0 end),
    shier=Sum(case DATEPART(month,aa.date) when 12 then aa.pt  else 0 end)
     from
    (select a.ID,a.flynn_pkid,a.flynn_code,a.date,a.pt,b.name,b.style
     from #ivy a 
    left join #flynn b 
    on a.flynn_pkid=b.pkid and a.flynn_code=b.code
    )aa group by name,style,flynn_pkid
     
    是不是要这个结果
      

  7.   

    misslemy 兄,你的最早最正确,我的日期是测试的,当时没写,是我抽象的模型。
    幸好你搞定了呵呵谢谢你!+40晕,其他兄弟们字数多的加辛苦分!全部感谢!
      

  8.   


    Declare @BeginDate as Datetime
    Declare @EndDate as Datetime
    Declare @Ttemp Table(Date Datetime) ---------建立一张临时表,用于存储查询时间Set @BeginDate='2009-1-1'---这里输入你想要查询的开始时间
    set @EndDate='2009-12-1'---这里输入你想要查询的结束时间-----将查询时间放在临时表中
    While @BeginDate<=@EndDate
         Begin
              Insert into @Ttemp(Date) values(@BeginDate)
              Set @BeginDate=Dateadd(Month,1,@BeginDate)
         Endselect a.id,flynn_code,b.name  as flynn_name,sum(pt) as total,Month(c.Date) as [Month]
    from ivy  a left join flynn  b on a.flynn_code = b.code
    left join @Ttemp c on datediff(Month,a.Date,c.Date)=0
    group by a.id,a.flynn_code,b.name,c.Date