需求是这样的,有以下三张表商场表:store(MNO,MNAME,CITY) 各属性含义依次 为商场号、商场名和商场所在城市;主键为商场号;
商品表:gds(PNO,PNAME,CITY,COLOR)各属性含义依次为商品号、商品名、产地和 商品颜色;主键为商品号;
销售表:sale(MNO,PNO,QTY,COST,SALE)各属性含义依次为商场号、商品号、销售 数量、销售成本和销售金额;
sale表中数据如下:
MNO PNO QTY COST SALE
1101 0002 3 3.9 5.7
1101 0020 30 300 360
1101 0002 3 3.9 5.7
1102 0020 35 385 445
1103 0022 33 33 36.3
1103 0024 25 12.5 15
1104 0023 34 3400 4080问题是想做一个1101,1102门店商品销售门店对比表,要求把空值(NULL)输出 为0,报表中要包含 商品编码、商品名称、颜色、1101店(销售数量、销售成本 、销售额)、1102店(销售数量、销售成本、销售额)SQL

解决方案 »

  1.   

    FYIcreate table #store
    (MNO int
    ,MNAME varchar(100)
    ,CITY varchar(100)
    )
    create table #gds
    (PNO varchar(50)
    ,PNAME varchar(100)
    ,CITY varchar(100)
    ,COLOR varchar(100)
    )
    create table #sale
    (MNO varchar(50)
    ,PNO varchar(50)
    ,QTY int
    ,COST decimal(18,2)
    ,SALE decimal(18,2)
    )
    insert into #sale
    select '1101', '0002', 3 ,3.9 ,5.7 union all
    select '1101', '0020', 30, 300, 360 union all
    select '1101', '0002', 3 ,3.9 ,5.7 union all
    select '1102', '0020', 35, 385, 445 union all
    select '1103', '0022', 33, 33 ,36.3 union all
    select '1103', '0024', 25, 12.5, 15 union all
    select '1104', '0023', 34, 3400, 4080
    /***************************木有汇总****************************
    select a.PNO,a.MNO,
    (select cast(t.QTY as varchar)+',',cast(t.COST as varchar)+',',cast(t.SALE as varchar)+',' 
    from #sale t 
    where t.MNO=a.MNO and t.PNO=a.PNO
    for XML path(''))as 'Sumary'
    into #X
    from #sale a*************************************************************//****************************汇总后的*****************************/
    select a.PNO,a.MNO,
    (select cast(sum(t.QTY) as varchar)+',',cast(sum(t.COST) as varchar)+',',cast(sum(t.SALE) as varchar)+',' 
    from #sale t 
    where t.MNO=a.MNO and t.PNO=a.PNO 
    group by t.PNO,t.MNO
    for XML path(''))as 'Sumary'
    into #X
    from #sale a
    group by a.PNO,a.MNO
    Declare @SqlStr nvarchar(max)
    set @SqlStr= 'select x.PNO,g.PNAME,g.COLOR'
    select @SqlStr+=',case MNO when '''+z.MNO+''' then x.Sumary else ''0,0,0'' end as '''+z.MNO+'(QTY,Cost,Sale)'' '
    from (select distinct MNO from #sale )z
    set @SqlStr +='from #x x left join #gds g on g.PNO=x.PNO order by x.PNO'--select @SqlStr
    exec(@SqlStr)
    drop table #gds
    drop table #sale
    drop table #store
    drop table #X