有如下数据:
库存表A
物品分类  物品仓位    数量
电视        A001       50
电视        A002       30 
冰箱        A001       25
冰箱        A003       60 
微波炉      A001        5
冰箱        A002       10通过以上数据,形成下面报表
物品分类   仓位分类数量                            物品分类数量
电视       (1/3个A001+1/2个A002)                       80
冰箱       (1/3个A001+1/2个A002+1个A003)               95
微波炉      1/3个A001                                    5 以上报表数据计算方法:
数据分类:    
    取库存表A中的全部物品分类
仓位分类数量:
    如果一个仓位上放置的是一个分类物品则计算为1,如果一个托板放置的是2或n个分类的物品则计算为1/2或1/n个托板
物品分类数量:
    汇总库存表A中的物品分类中的数量请教为实现上述结果,SQL语句该如何写?多谢!
     
   

解决方案 »

  1.   

    更正一下:
    仓位分类数量:
      如果一个仓位上放置的是一个分类物品则计算为1,如果一个仓位放置的是2或n个分类的物品则计算为1/2或1/n个仓位To xuam:还需要什么条件呢?
      

  2.   

    把建表的SQL贴出来了:CREATE TABLE [dbo].[Test123](
        [物品分类] [nvarchar](50),
        [物品仓位] [nvarchar](50) ,
        [数量] [numeric](28, 8) ,
    ) ON [PRIMARY]
    insert into Test123 values('电视','A001',50)
    insert into Test123 values('电视','A002',30)
    insert into Test123 values('冰箱','A001',25)
    insert into Test123 values('冰箱','A003',60)
    insert into Test123 values('微波炉','A001',5)
    insert into Test123 values('冰箱','A002',10)
      
      

  3.   

    --建立一个临时表(视图也可以),增加的一列仓位分类数量用来保存“1/3个A001”
    select A.*,'1/'+ltrim(B.仓位数量) as 仓位分类数量 
    from A into ls
    inner join (select 物品仓位,仓位数量=count(1) from A group by 物品仓位) B 
    on A.物品仓位=B.物品仓位 --自定义函数用来组合相同物品分类的仓位分类数量
    create function dbo.fn_fl(@物品分类 varchar(100)) returns varchar(8000)
    as 
    begin
    declare @仓位分类数量 varchar(8000)
    set @仓位分类数量=''
    select @仓位分类数量=@仓位分类数量+仓位分类数量 from ls where 物品分类=@物品分类
    end--调用自定义函数查询
    select 物品分类,dbo.fn_fl(物品分类),sum(数量) from tb group by 物品分类
    --删除临时表
    drop table ls
      

  4.   


    不好意思,是我没有描述清楚。
    仓位分类数量是数值型,“1/3个A001+1/2个A002”是为了说明仓位分类数量这个字段的计算公式,“1/3个A001+1/2个A002”的结果应该是0.33+0.5=0.83
      

  5.   


    --建立一个临时表(视图也可以),增加的一列仓位分类数量用来保存“1/3个A001”
    select A.*,'1/'+ltrim(B.仓位数量) as 仓位分类数量 into ls
    from Test123 A
    inner join (select 物品仓位,仓位数量=count(1) from Test123 group by 物品仓位) B 
    on A.物品仓位=B.物品仓位 
    go
    --自定义函数用来组合相同物品分类的仓位分类数量
    create function dbo.fn_fl(@物品分类 varchar(100)) returns varchar(8000)
    as 
    begin
    declare @仓位分类数量 varchar(8000)
    set @仓位分类数量=''
    select @仓位分类数量=@仓位分类数量+仓位分类数量+'个'+物品仓位+'+' from ls where 物品分类=@物品分类
    set @仓位分类数量=left(@仓位分类数量,len(@仓位分类数量)-1)
    return @仓位分类数量
    end
    go
    --调用自定义函数查询
    select 物品分类,dbo.fn_fl(物品分类),sum(数量) from Test123 group by 物品分类
    --删除临时表
    drop table ls
    drop function dbo.fn_fl/*
    (所影响的行数为 6 行)
    物品分类                                                                                                                                                                                                                                                                                                                                                         
    -------------------------------------------------- ---------------------------------------------------------
    冰箱                                                 1/3个A001+1/2个A002+1/1个A003          95.00000000
    电视                                                 1/3个A001+1/2个A002                     80.00000000
    微波炉                                                1/3个A001                            5.00000000
    (所影响的行数为 3 行)
    */
      

  6.   

    select 物品分类,仓位分类数量=sum(仓位分类数量),物品分类数量=sum(数量) from 
    (select A.*,cast(1.0/(B.仓位数量) as decimal(18,2)) as 仓位分类数量 
    from Test123 A
    inner join (select 物品仓位,仓位数量=count(1) from Test123 group by 物品仓位) B 
    on A.物品仓位=B.物品仓位) C
    group by 物品分类
    希望下次简单的事情描述清楚点
      

  7.   

    都真的很强大呀???为什么不用povit
    use demo
    go
    create table sale 
    (customer varchar(10) not null,
    product varchar(20) not null,
    number int not null
    )
    go
    --add data to table
    insert into sale values('张三','自行车',3)
    insert into sale values('张三','电视机',2)
    insert into sale values('张三','自行车',5)
    insert into sale values('李四','自行车',3)
    insert into sale values('李四','电视机',3)
    insert into sale values('李四','电视机',4)
    insert into sale values('李四','自行车',2)select * from sale pivot (sum(number) for product in(自行车,电视机)) as a
    行列转换 加group功能..