新人,没什么分,谢谢各位达人了
表 tb
数量  名称   场地     时间        价格 
100    A     广东   2008-1-2      102
280    B     海南   2008-2-9      120
200    A     海南   2008-1-5      130
109    C     广东   2008-1-3      135
200    A     海南   2008-1-7      200
…………………………………………………………
我想得到如下结果,比如A在1月份期间在哪些场地分别对应多少数量,每个场地所占的数量占总数量的比例
名称  场地    数量    比例
A     广东    100    0.25 
      海南    400    0.75B     海南    280      1^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

解决方案 »

  1.   

    select a.名称, 场地, 数量, 比例 = cast(数量*100.0/总数量 as numeric(5,2))
    into #t1
    from tb a
    join (select 名称, 总数量=sum(数量) from tb where 时间 between @bgnTime and @endTime group by 名称) as s
      on b.名称=a.名称
    where 时间 between @bgnTime and @endTime 
    order by a.名称, 场地select
        名称 = case when exists (select 1 from #t1 b where b.名称=a.名称 and b.场地<a.场地) then '' else a.场地 end
      , 场地
      , 数量
      , 比例
    from #t1 adrop taboe #t1
      

  2.   

    按照time说的,执行结果报错,如下所示:
    列前缀 'b' 与查询中所用的表名或别名不匹配。另外,及时修改了以后,好像结果也不对。
    我要的是每个名称所对应的所有场地,以及这些场地的数量和每个场地的数量占这些场地总数量的百分比哪位达人再给看看,等两天了。
      

  3.   

    select a.名称, 场地, 数量, 比例 = cast(数量*100.0/总数量 as numeric(5,2)) into #t1 from tb a join (select 名称, 总数量=sum(数量) from tb where 时间 between @bgnTime and @endTime group by 名称) as b on b.名称=a.名称 where 时间 between @bgnTime and @endTime order by a.名称, 场地 select  名称 = case when exists (select 1 from #t1 b where b.名称=a.名称 and b.场地<a.场地) then '' else a.场地 end  , 场地 , 数量 , 比例 from #t1 a drop taboe #t1
      

  4.   

    select a.名称, 场地, 数量, 比例 = cast(数量*100.0/总数量 as numeric(5,2)) 
    into #t1 
    from tb a 
    join (select 名称, 总数量=sum(数量) from tb where 时间 between @bgnTime and @endTime group by 名称) as b 
          on b.名称=a.名称 
    where 时间 between @bgnTime and @endTime 
    order by a.名称, 场地 select
      名称 = case when exists (select 1 from #t1 b where b.名称=a.名称 and b.场地<a.场地) then '' else a.场地 end  , 
      场地 , 
      数量 , 
      比例 
    from #t1 a drop taboe #t1
      

  5.   

    我已经说了,把s改成b也不行,出的结果不是我想要的。
    差别如下:
    要把相同的场地的数量累加。
    例如 A 有两个场地 海南和广东, 在统计的时候要把海南的数量加起来算一个。
    下面即使修改过的语句也做不到
    select a.名称, 场地, 数量, 比例 = cast(数量*100.0/总数量 as numeric(5,2))
    into #t1
    from tb a
    join (select 名称, 总数量=sum(数量) from tb where 时间 between @bgnTime and @endTime group by 名称) as b
      on b.名称=a.名称
    where 时间 between @bgnTime and @endTime 
    order by a.名称, 场地select
        名称 = case when exists (select 1 from #t1 b where b.名称=a.名称 and b.场地<a.场地) then '' else a.名称 end
      , 场地
      , 数量
      , 比例
    from #t1 adrop taboe #t1
      

  6.   

    create table tb(数量 int, 名称 varchar(10), 场地 varchar(10), 时间 datetime , 价格 int)
    insert into tb values(100, 'A', '广东', '2008-1-2', 102 )
    insert into tb values(280, 'B', '海南', '2008-2-9', 120 )
    insert into tb values(200, 'A', '海南', '2008-1-5', 130 )
    insert into tb values(109, 'C', '广东', '2008-1-3', 135 )
    insert into tb values(200, 'A', '海南', '2008-1-7', 200 )
    godeclare @时间 as varchar(7)
    set @时间 = '2008-01'select t1.* , 比例 = cast(t1.数量*1.0/t2.数量 as decimal(18,2)) from
    (select 名称 , 场地 , sum(数量) 数量 from tb where convert(varchar(7),时间,120) = @时间 group by 名称 , 场地) t1,
    (select 名称 , sum(数量) 数量 from tb where convert(varchar(7),时间,120) = @时间 group by 名称) t2
    where t1.名称 = t2.名称
    order by t1.名称drop table tb/*
    名称         场地         数量          比例                   
    ---------- ---------- ----------- -------------------- 
    A          广东         100         .20
    A          海南         400         .80
    C          广东         109         1.00
    (所影响的行数为 3 行)
    */
      

  7.   

    好的,没问题了,谢谢老乌龟(为啥叫这个名字呢?),谢谢time,谢谢 areswang.