有一个库存表为T_ProductionPro ,要求按月分类统计其库存数量,下面是一段按月分类统计的SQL语句SELECT month(fsProdate) as 月份,fsProName as 货物名,fssize as 规格,fsunit as 单位,sum(fsweight) as 库存数量
FROM T_ProductionPro    
WHERE year(fsProdate)='2005' 
GROUP BY month(fsProdate),fsproname,fssize,fsunit但这库存数量的统计出来的结果是该月1号到该月末的结果
如从1月1日到1月末买了10本笔记本,2月1日到2月末买了20本笔记本,3月1日到3月末买了30本笔记本
即:月份     货物名      规格     单位    库存数量
1         笔记本     硬皮      本       10
2         笔记本     硬皮      本       20
3         笔记本     硬皮      本       30
所要求的显示是该1号到月末的库存+以前累加月库存即:月份     货物名      规格     单位    库存数量
1         笔记本     硬皮      本       10
2         笔记本     硬皮      本       30
3         笔记本     硬皮      本       40请问这样的SQL语句怎么写呀

解决方案 »

  1.   

    SELECT 
          month(fsProdate) as 月份,
          fsProName as 货物名,
          fssize as 规格,
          fsunit as 单位,
          sum(fsweight)+(
                         select sum(fsweight) 
                         from T_ProductionPro 
                         where fsProName=a.fsProName and 
                               fssize=a.fssize and 
                               fsunit =a.fsunit and 
                               convert(varchar(10),fsProdate,112) >= cast(year(a.fsProdate) as varchar(4)+'0101' and 
                               convert(varchar(10),fsProdate,112)<Left(convert(varchar(10),a.fsProdate,112),6)+'01' ) as 库存数量
    FROM T_ProductionPro a    
    WHERE year(fsProdate)='2005' 
    GROUP BY month(fsProdate),fsproname,fssize,fsunit
      

  2.   

    SELECT 
          month(fsProdate) as 月份,
          fsProName as 货物名,
          fssize as 规格,
          fsunit as 单位,
          sum((fsweight)+(
             ******
                         select sum(fsweight) 
                         from T_ProductionPro 
                         where fsProName=a.fsProName and 
                               fssize=a.fssize and 
                               fsunit =a.fsunit and 
                               convert(varchar(10),fsProdate,112) >= cast(year(a.fsProdate) as varchar(4)+'0101' and 
                               convert(varchar(10),fsProdate,112)<Left(convert(varchar(10),a.fsProdate,112),6)+'01' ) )as 库存数量
                                *****
    FROM T_ProductionPro a    
    WHERE year(fsProdate)='2005' 
    GROUP BY month(fsProdate),fsproname,fssize,fsunit
      

  3.   

    SELECT 
          month(fsProdate) as 月份,
          fsProName as 货物名,
          fssize as 规格,
          fsunit as 单位,
          sum(fsweight)+(
                         select sum(fsweight) 
                         from T_ProductionPro 
                         where fsProName=a.fsProName and 
                               fssize=a.fssize and 
                               fsunit =a.fsunit and 
                               convert(varchar(10),fsProdate,112) >= cast(year(a.fsProdate) as varchar(4))+'0101' and 
                               convert(varchar(10),fsProdate,112)<Left(convert(varchar(10),a.fsProdate,112),6)+'01' ) as 库存数量
    FROM T_ProductionPro a    
    WHERE year(fsProdate)='2005' 
    GROUP BY month(fsProdate),fsproname,fssize,fsunit
      

  4.   

    TO:僵哥
    执行刚刚你给的语句提示:
    服务器: 消息 8120,级别 16,状态 1,行 1
    列 'a.fsProDate' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
    服务器: 消息 8120,级别 16,状态 1,行 1
    列 'a.fsProDate' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
    我的表结构:
    CREATE TABLE [T_ProductionPro] (
    [fsProDate] [datetime] NULL ,
    [fsWorkDate] [datetime] NULL ,
    [fsAvailDate] [datetime] NULL ,
    [fsNo] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [fsBatchNo] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [fsBarcodeNo] [varchar] (30) COLLATE Chinese_PRC_CI_AS NULL ,
    [fsProNo] [varchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,
    [fsProName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [fsSize] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [fsUnit] [varchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,
    [fsWeight] [bigint] NULL ,
    [fsWHMen] [varchar] (16) COLLATE Chinese_PRC_CI_AS NULL ,
    [fswarehouse] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
    GO
      

  5.   

    数据:
           fsProdate                                                   fsproName   fssize  fsunit  fsweight
    2005-1-1 笔记本 硬皮 本 5
    2005-1-2 笔记本 硬皮 本 5
    2005-2-1 笔记本 硬皮 本 10
    2005-2-2 笔记本 硬皮 本 10
    2005-3-1 笔记本 硬皮 本 30
      

  6.   

    SELECT 
          month(fsProdate) as 月份,
          fsProName as 货物名,
          fssize as 规格,
          fsunit as 单位,
          sum(fsweight)+(
                         select sum(fsweight) 
                         from T_ProductionPro 
                         where fsProName=a.fsProName and 
                               fssize=a.fssize and 
                               fsunit =a.fsunit and 
                               convert(varchar(10),fsProdate,112) >= '20050101' and 
                               convert(varchar(10),fsProdate,112)<'2005'+cast(month(a.fsProdate) as varchar(2))+'01' ) as 库存数量
    FROM T_ProductionPro a    
    WHERE year(fsProdate)='2005' 
    GROUP BY month(fsProdate),fsproname,fssize,fsunit=============================
    这里面将2005直接跟where条件一样用字符串传入。
      

  7.   

    TO:僵哥
    执行你上面的结果:
    服务器: 消息 8120,级别 16,状态 1,行 1
    列 'a.fsProDate' 在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
    我的表数据为:
            fsProdate   fsproName   fssize  fsunit  fsweight
    2005-1-1 笔记本 硬皮 本 5
    2005-1-2 笔记本 硬皮 本 5
    2005-2-1 笔记本 硬皮 本 10
    2005-2-2 笔记本 硬皮 本 10
    2005-3-1 笔记本 硬皮 本 30
      

  8.   

    CREATE TABLE [T_ProductionPro] (
    [fsProDate] [datetime] NULL ,
    [fsWorkDate] [datetime] NULL ,
    [fsAvailDate] [datetime] NULL ,
    [fsNo] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [fsBatchNo] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [fsBarcodeNo] [varchar] (30) COLLATE Chinese_PRC_CI_AS NULL ,
    [fsProNo] [varchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,
    [fsProName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [fsSize] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [fsUnit] [varchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,
    [fsWeight] [bigint] NULL ,
    [fsWHMen] [varchar] (16) COLLATE Chinese_PRC_CI_AS NULL ,
    [fswarehouse] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
    GOinsert into T_ProductionPro(fsprodate, fsproname, fssize, fsunit, fsweight)
    select '2005-1-1','笔记本','硬皮','本',5
    union select '2005-1-2','笔记本','硬皮','本',5
    union select '2005-2-1','笔记本','硬皮','本',10
    union select '2005-2-2','笔记本','硬皮','本',10
    union select '2005-3-1','笔记本','硬皮','本',30
    select month(fsProdate) as 月份,fsProName as 货物名,fssize as 规格,fsunit as 单位, kcl as 库存数量
    from
    (select *,
    (select sum(fsweight) from T_ProductionPro where month(fsprodate) <=month(a.fsprodate)) as kcl
    from T_ProductionPro a ) x
    group by month(fsprodate),fsproname,fssize,fsunit,kcl--显示结果:
    月份    货物名   规格   单位    库存数量
    1 笔记本 硬皮 本 10
    2 笔记本 硬皮 本 30
    3 笔记本 硬皮 本 60