三张表: 
t1(商品名称表):商品编码,商品名称 
t2(商品入库表):商品编码,进价,数量 
t3(商品出库表): 商品编码,售价,数量 
现在要按商品名称统计商品在某段时期内入库的数量,金额,对于在此期间入库了的商品,还要统计在此期间的出库数量和金额 
即结果如下: 商品名称  入库数量  入库数量百分比 入库金额  入库金额百分比 出库数量 出库数量百分比  出库金额 出库金额百分比 只显示入了库的商品,未入库的商品不统计,其中入库数量百分比指的是该商品的入库数量占所有商品入库总量的百分比

解决方案 »

  1.   

    日期限制的写法(含百分比的显示): select a.商品编码,
           isnull(t1.商品名称, A.商品编码) as 商品名称,
           A.入库数量,
           A.入库金额,
           isnull(B.出库数量, 0) as 出库数量,
           ltrim(cast(isnull(B.出库数量, 0) * 100.0 / A.入库数量 as
                      numeric(5, 2))) + '%' as 出库数量百分比,
           isnull(B.出库金额, 0) as 出库金额
      from (select 商品编码, sum(数量) as 入库数量, sum(进价 * 数量) as 入库金额
              from t2 where 日期>='2008-2-1' and 日期<='2008-2-28'
             group by 商品编码) as A
      left join (select 商品编码,
                        sum(数量) as 出库数量,
                        sum(售价 * 数量) as 出库金额
                   from t3 where 日期>='2008-2-1' and 日期<='2008-2-28'
                  group by 商品编码) as B on A.商品编码 = B.商品编码
      left join t1 on A.商品编码 = t1.商品编码楼主在另一贴不是已有答案了吗?
      

  2.   


    select c.商品名称,
      a.数量 as 入库数量,case when d.数量>0 then cast((a.数量/d.数量 * 100)as varchar(50))+'%' else 0 end  as 入库数量百分比,
      a.金额 as 入库金额,case when d.金额>0 then cast((a.金额/d.金额 * 100)as varchar(50))+'%'  else 0 end as 入库金额百分比,
      ISnull(b.数量,0) as 出库数量,case when e.数量>0 then cast((ISnull(b.数量,0)/e.数量 * 100)as varchar(50))+'%' else 0 end as 出库数量百分比,
      ISnull(b.金额,0) as 出库金额,case when e.金额 >0 then cast((ISnull(b.金额,0)/e.金额 * 100)as varchar(50))+'%' else 0 end as 出库金额百分比
    from 
    (
    select IsNull(sum(数量),0) as 数量 ,IsNUll(sum(金额),0) as 金额 from t2
    )d,(
    select IsNull(sum(数量),0) as 数量 ,IsNUll(sum(金额),0) as 金额 from t3
    )e,
    (
    select 商品编码,sum(数量) as 数量 ,sum(金额) as 金额 from t2 where 入库时间>='' and 入库时间<='' group by 商品编码
    )a left join
    (
    select 商品编码,sum(数量) as 数量 ,sum(金额) as 金额 from t3 where 出库时间>='' and 出库时间<='' group by 商品编码
    )b on a.商品编码=b.商品编码
    inner join
    (
    select * from t1
    ) c on a.商品编码=c.商品编码
      

  3.   

    哎 比我的那SQL语句简单多了,我的SQL语句出了问题都 不知道从何改起.....
           -_-!!!
      

  4.   

    谢谢各位,我参照dh9450 的方法写了自己的sql,但是现在报错:
    服务器: 消息 8114,级别 16,状态 5,行 1
    将数据类型 varchar 转换为 numeric 时出错。
    麻烦大家帮我看看吧SELECT E.JC,E.PJMC AS 零件名称, E.PJDM as 零件代码, E.CX as 车型, E.CD as 产地,
           A.入库次数 AS 入库次数,A.入库数量 AS 入库数量,A.入库金额 AS 入库金额,
           A.最高成本价 AS 最高成本价,A.最低成本价 AS 最低成本价,A.平均成本价 AS 平均成本价,
           CASE WHEN c.入库总数量>0 THEN CAST(A.入库数量/C.入库总数量*100 AS numeric(5, 2))+'%' ELSE 0 END AS 入库数量百分比,
           CASE WHEN C.入库总金额>0 THEN CAST(A.入库金额/C.入库总金额*100 AS numeric(5, 2))+'%' ELSE 0 END AS 入库金额百分比,
           B.出库次数 AS 出库次数,B.出库数量 AS 出库数量,B.出库金额 AS 出库金额,
           B.最高售价 AS 最高售价,B.最低售价 AS 最低售价,B.平均售价 AS 平均售价,
           CASE WHEN D.出库总数量>0 THEN CAST(B.出库数量/D.出库总数量*100 AS numeric(5, 2))+'%' ELSE 0 END AS 出库数量百分比,
           CASE WHEN D.出库总金额>0 THEN CAST(B.出库金额/D.出库总金额*100 AS numeric(5, 2))+'%' ELSE 0 END AS 出库金额百分比
    from 
         (
          select IsNull(sum(sl),0) as 入库总数量,IsNull(sum(sl*cbj),0) as 入库总金额 
          from t_0102 
          where rkdh in (select rkdh from t_0101 where jhrq>='2008-06-13' and jhrq<='2008-06-13')        
         ) C,
         (
          select IsNull(sum(sl),0) as 出库总数量,IsNull(sum(sl*dj),0) as 出库总金额 
          from t_0202 
          where ckdh in (select ckdh from t_0201 where chrq>='2008-06-13' and chrq<='2008-06-13')
         ) D, 
         (
          select pjbm,
          count(pjbm) as 入库次数,
          sum(sl) AS 入库数量,
          SUM(CBJ*SL) AS 入库金额,
          Cast(AVG(CBJ) as decimal(10,2)) AS 平均成本价,
          MAX(CBJ) AS 最高成本价,
          MIN(CBJ) AS 最低成本价 
          FROM T_0102 
          where rkdh in (select rkdh from t_0101 where jhrq>='2008-06-13' and jhrq<='2008-06-13')
          GROUP BY PJBM
         ) A LEFT JOIN
         (
          select pjbm,
          count(pjbm) as 出库次数,
          sum(sl) AS 出库数量,
          SUM(DJ*SL) AS 出库金额,
          Cast(AVG(DJ) as decimal(10,2)) AS 平均售价,
          MAX(DJ) AS 最高售价,
          MIN(DJ) AS 最低售价 
          FROM T_0202 
          where ckdh in (select ckdh from t_0201 where chrq>='2008-06-13' and chrq<='2008-06-13')
          GROUP BY PJBM
         ) B ON A.PJBM=B.PJBM 
         LEFT JOIN 
        (
         SELECT PJBM,JC,PJMC,PJDM,CX,CD FROM T_0103
        ) E ON A.PJBM=E.PJBM
      

  5.   

    SELECT E.JC,E.PJMC AS 零件名称, E.PJDM as 零件代码, E.CX as 车型, E.CD as 产地,
           A.入库次数 AS 入库次数,A.入库数量 AS 入库数量,A.入库金额 AS 入库金额,
           A.最高成本价 AS 最高成本价,A.最低成本价 AS 最低成本价,A.平均成本价 AS 平均成本价,
           CASE WHEN c.入库总数量>0 THEN CAST(A.入库数量/C.入库总数量*100 AS numeric(5, 2))+'%' ELSE 0 END AS 入库数量百分比,
           CASE WHEN C.入库总金额>0 THEN CAST(A.入库金额/C.入库总金额*100 AS numeric(5, 2))+'%' ELSE 0 END AS 入库金额百分比,
           B.出库次数 AS 出库次数,B.出库数量 AS 出库数量,B.出库金额 AS 出库金额,
           B.最高售价 AS 最高售价,B.最低售价 AS 最低售价,B.平均售价 AS 平均售价,
           CASE WHEN D.出库总数量>0 THEN CAST(B.出库数量/D.出库总数量*100 AS numeric(5, 2))+'%' ELSE 0 END AS 出库数量百分比,
           CASE WHEN D.出库总金额>0 THEN CAST(B.出库金额/D.出库总金额*100 AS numeric(5, 2))+'%' ELSE 0 END AS 出库金额百分比
    from 
         (
          select IsNull(sum(sl),0) as 入库总数量,IsNull(sum(sl*cbj),0) as 入库总金额 
          from t_0102 
          where rkdh in (select rkdh from t_0101 where jhrq>='2008-06-13' and jhrq<='2008-06-13')        
         ) C,
         (
          select IsNull(sum(sl),0) as 出库总数量,IsNull(sum(sl*dj),0) as 出库总金额 
          from t_0202 
          where ckdh in (select ckdh from t_0201 where chrq>='2008-06-13' and chrq<='2008-06-13')
         ) D, 
         (
          select pjbm,
          count(pjbm) as 入库次数,
          sum(sl) AS 入库数量,
          SUM(CBJ*SL) AS 入库金额,
          Cast(AVG(CBJ) as decimal(10,2)) AS 平均成本价,
          MAX(CBJ) AS 最高成本价,
          MIN(CBJ) AS 最低成本价 
          FROM T_0102 
          where rkdh in (select rkdh from t_0101 where jhrq>='2008-06-13' and jhrq<='2008-06-13')
          GROUP BY PJBM
         ) A LEFT JOIN
         (
          select pjbm,
          count(pjbm) as 出库次数,
          sum(sl) AS 出库数量,
          SUM(DJ*SL) AS 出库金额,
          Cast(AVG(DJ) as decimal(10,2)) AS 平均售价,
          MAX(DJ) AS 最高售价,
          MIN(DJ) AS 最低售价 
          FROM T_0202 
          where ckdh in (select ckdh from t_0201 where chrq>='2008-06-13' and chrq<='2008-06-13')
          GROUP BY PJBM
         ) B ON A.PJBM=B.PJBM 
         LEFT JOIN 
        (
         SELECT PJBM,JC,PJMC,PJDM,CX,CD FROM T_0103
        ) E ON A.PJBM=E.PJBM
      

  6.   


    SELECT E.JC,E.PJMC AS 零件名称, E.PJDM as 零件代码, E.CX as 车型, E.CD as 产地,
           A.入库次数 AS 入库次数,A.入库数量 AS 入库数量,A.入库金额 AS 入库金额,
           A.最高成本价 AS 最高成本价,A.最低成本价 AS 最低成本价,A.平均成本价 AS 平均成本价,
           CASE WHEN c.入库总数量>0 THEN CAST(A.入库数量/C.入库总数量*100 AS numeric(5, 2))+'%' ELSE 0 END AS 入库数量百分比,
           CASE WHEN C.入库总金额>0 THEN CAST(A.入库金额/C.入库总金额*100 AS numeric(5, 2))+'%' ELSE 0 END AS 入库金额百分比,
           B.出库次数 AS 出库次数,B.出库数量 AS 出库数量,B.出库金额 AS 出库金额,
           B.最高售价 AS 最高售价,B.最低售价 AS 最低售价,B.平均售价 AS 平均售价,
           CASE WHEN D.出库总数量>0 THEN CAST(B.出库数量/D.出库总数量*100 AS numeric(5, 2))+'%' ELSE 0 END AS 出库数量百分比,
           CASE WHEN D.出库总金额>0 THEN CAST(B.出库金额/D.出库总金额*100 AS numeric(5, 2))+'%' ELSE 0 END AS 出库金额百分比
    from 
         (
          select IsNull(sum(sl),0) as 入库总数量,IsNull(sum(sl*cbj),0) as 入库总金额 
          from t_0102 
          where rkdh in (select rkdh from t_0101 where jhrq>='2008-06-13' and jhrq<='2008-06-13')        
         ) C,
         (
          select IsNull(sum(sl),0) as 出库总数量,IsNull(sum(sl*dj),0) as 出库总金额 
          from t_0202 
          where ckdh in (select ckdh from t_0201 where chrq>='2008-06-13' and chrq<='2008-06-13')
         ) D, 
         (
          select pjbm,
          count(pjbm) as 入库次数,
          sum(sl) AS 入库数量,
          SUM(CBJ*SL) AS 入库金额,
          Cast(AVG(CBJ) as decimal(10,2)) AS 平均成本价,
          MAX(CBJ) AS 最高成本价,
          MIN(CBJ) AS 最低成本价 
          FROM T_0102 
          where rkdh in (select rkdh from t_0101 where jhrq>='2008-06-13' and jhrq<='2008-06-13')
          GROUP BY PJBM
         ) A LEFT JOIN
         (
          select pjbm,
          count(pjbm) as 出库次数,
          sum(sl) AS 出库数量,
          SUM(DJ*SL) AS 出库金额,
          Cast(AVG(DJ) as decimal(10,2)) AS 平均售价,
          MAX(DJ) AS 最高售价,
          MIN(DJ) AS 最低售价 
          FROM T_0202 
          where ckdh in (select ckdh from t_0201 where chrq>='2008-06-13' and chrq<='2008-06-13')
          GROUP BY PJBM
         ) B ON A.PJBM=B.PJBM 
         LEFT JOIN 
        (
         SELECT PJBM,JC,PJMC,PJDM,CX,CD FROM T_0103
        ) E ON A.PJBM=E.PJBM
      

  7.   

    干嘛要转成numeric 
    numeric怎么和字符相加