有一个库存表为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语句怎么写呀
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语句怎么写呀
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
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
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
执行刚刚你给的语句提示:
服务器: 消息 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
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
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条件一样用字符串传入。
执行你上面的结果:
服务器: 消息 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
[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