select 日期,
   [1号库]=sum(case when 仓库=N'1号库' then 数量 else 0 end),
   [2号库]=sum(case when 仓库=N'2号库' then 数量 else 0 end),
   [3号库]=sum(case when 仓库=N'3号库' then 数量 else 0 end),
   [4号库]=sum(case when 仓库=N'4号库' then 数量 else 0 end),
   [5号库]=sum(case when 仓库=N'5号库' then 数量 else 0 end)
from(
    select 日期,仓库=导出库,数量=-数量 from a
    union all
    select 日期,仓库=导入库,数量=数量 from a
)a group by 日期

解决方案 »

  1.   

    -- 如果你的仓库是不固定的,则可以这样写:declare @s nvarchar(4000)
    set @s=''
    select @s=@s+N','+quotename(仓库)+N'=sum(case when 仓库=N'+quotename(仓库,N'''')+' then 数量 else 0 end)'
    from(
       select 导入库 from a 
       union 
       select 导出库 from a 
    )aa
    exec(N'
    select 日期'+@s+N'
    from(
        select 日期,仓库=导出库,数量=-数量 from a
        union all
        select 日期,仓库=导入库,数量=数量 from a
    )a group by 日期')
      

  2.   

    select 日期,
           ,sum(case when 仓库=N'1号库' then 数量 else 0 end) as '1号库',
           ,sum(case when 仓库=N'2号库' then 数量 else 0 end) as '2号库'
           ,sum(case when 仓库=N'3号库' then 数量 else 0 end) as '3号库'
           ,sum(case when 仓库=N'4号库' then 数量 else 0 end) as '4号库'
           ,sum(case when 仓库=N'5号库' then 数量 else 0 end) as '5号库'
    from(
           select 日期,仓库=导出库,数量=-数量 from a
           union all
           select 日期,仓库=导入库,数量=数量 from a
       )t 
    group by 日期
      

  3.   

    select 日期,
    1号库=sum(case when 导出库='1号库' then -数量 
    when 导入库='1号库' then 数量 end)
    2号库=sum(case when 导出库='2号库' then -数量 
    when 导入库='2号库' then 数量 end)
    3号库=sum(case when 导出库='3号库' then -数量 
    when 导入库='3号库' then 数量 end)
    4号库=sum(case when 导出库='4号库' then -数量 
    when 导入库='4号库' then 数量 end)
    5号库=sum(case when 导出库='5号库' then -数量 
    when 导入库='5号库' then 数量 end)
    from tba group by 日期
      

  4.   

    --测试环境
    create table AT (编号 int ,导出库 varchar(10),导入库 varchar(10),数量 int ,日期 varchar(20))
    insert into AT select 1,'1号库','2号库',10,'2005-06-09'
    union all select 2,'1号库','3号库',15,'2005-09-09'
    union all select 2,'4号库','5号库',20,'2005-11-09'--动态SQL
    declare @s varchar(2000)
    set @s='SELECT 日期'
    select @s=@s+',['+库号+']=case when 导出库='''+库号+''' then -数量 
          when 导入库='''+库号+''' then 数量 end'
    from 
    (  select 导出库 as 库号 from AT 
    union 
    select 导入库 as 库号 from AT 
    )A
    set @s=@s+' From AT '
    exec(@s)--结果
    日期                   1号库         2号库         3号库         4号库         5号库         
    -------------------- ----------- ----------- ----------- ----------- ----------- 
    2005-06-09           -10         10          NULL        NULL        NULL
    2005-09-09           -15         NULL        15          NULL        NULL
    2005-11-09           NULL        NULL        NULL        -20         20
    --删除测试环境
    Drop table [AT]
      

  5.   

    to zlp321002(如果有一天,世界会改变) 
    ---------------------------------------
    我想按日期分组并汇总数量,如果一个仓库有进有出的话就不能直接用sum,我想直观的反应出每个仓库的纯调出量和纯调出量。
      

  6.   

    to   zjcxc(邹建) 
    -------------------------
    动态设置时提示仓库名无效
      

  7.   

    --不知道你要什么样的结果。我的也没用Sum,也不知道我的错在哪儿?:(
      

  8.   

    create table #T(编号 int,导出库 varchar(10),导入库 varchar(10),数量 int,日期 datetime) 
    insert into #T select 1,'1号库','2号库',10,'2005-06-09'
    insert into #T select 2,'1号库','3号库',15,'2005-09-09'
    insert into #T select 2,'4号库','5号库',20,'2005-11-09'select
        日期,
        [1号库] = (case '1号库' when 导出库 then -数量 when 导入库 then 数量 end),
        [2号库] = (case '2号库' when 导出库 then -数量 when 导入库 then 数量 end),
        [3号库] = (case '3号库' when 导出库 then -数量 when 导入库 then 数量 end),
        [4号库] = (case '4号库' when 导出库 then -数量 when 导入库 then 数量 end),
        [5号库] = (case '5号库' when 导出库 then -数量 when 导入库 then 数量 end)
    from
        #T
    order by
        日期
      

  9.   

    跟着学习做一做!:) 
    [create] table a
    (编号 int,导出库 varchar(20),导入库 varchar(20),数量 int,日期 datetime)insert into a
    select 1,'1号库','2号库',10,'2005-06-09' [union]
    select 2,'1号库','3号库',15,'2005-09-09' [union]
    select 2,'4号库','5号库',20,'2005-11-09'declare @s varchar(2000)select @s=''
    select @s= @s+','+quotename(仓库)+'=sum(case when 仓库='''+仓库+''' then 数量 else 0 end)'
    from 
    (select 仓库=导入库 from a
     [union]
     select 仓库=导出库 from a
    ) aa
    exec('select 日期'+@s+' from 
    (select 日期,仓库=导入库,数量=-数量 from a
     [union]
     select 日期,仓库=导出库,数量=数量 from a
    ) aa
    group by 日期')有时候真搞不懂,为什么我不把[create]和[union]打上括号就传不上来呢??
      

  10.   

    -- 如果你的仓库是不固定的,则可以这样写:declare @s nvarchar(4000)
    set @s=''
    select @s=@s+N','+quotename(仓库)+N'=sum(case when 仓库=N'+quotename(仓库,N'''')+' then 数量 else 0 end)'
    from(
       select 导入库 as 仓库 from a   --这里忘记指定别名了
       union 
       select 导出库 from a 
    )aa
    exec(N'
    select 日期'+@s+N'
    from(
        select 日期,仓库=导出库,数量=-数量 from a
        union all
        select 日期,仓库=导入库,数量=数量 from a
    )a group by 日期')
      

  11.   

    好多高手啊....
    能不能顺便帮小弟解答以下问题啊...
    http://community.csdn.net/Expert/topic/4287/4287987.xml?temp=.4798242