一个进销存Sql语句!高手来拿分!
【勾稽关系】进销存报表以开始时间和结束时间为查询条件 写成存储过程 不会弄了!疑点一:【上月初】:比如:这个月是7月份(上月初就是6月30日23点59分59秒以前的采购商品)【本月】就是:7月1日0时0分0秒-----到现在的我这边不知道怎么用时间控制,我感觉得用参数来控制 时间参数,如果谁做过这样的报表的话 帮一下写成存储过程。Sql提示:------------------------------------------------- --skuNo 商品编号 productName 商品名称 ArriveQty入库数量 Price 采购价格 RtnQty采购退货数量------商品编号、商品名称、上月初平均单价、上月初数量、上月初金额select t1.SkuNo,t1.ProductName,sum(isnull(t1.Price*t1.ArriveQty-t1.Price*t1. --,0.00)) / nullif((sum(t1.ArriveQty-t1.RtnQty)),0.00)as 上月初平均单价,SUM(t1.ArriveQty-t1.RtnQty)上月初数量,(sum(isnull(t1.Price*t1.ArriveQty-t1.Price*t1.RtnQty,0.00)) / nullif((sum(t1.ArriveQty-t1.RtnQty)),0.00)*SUM(t1.ArriveQty-t1.RtnQty)) as 上月初金额from V_PO_OrderItem as t1 where t1.CreateTime>=(SELECT DATEADD(Month,-1,CONVERT(datetime,CONVERT(char(8),getdate(),120)+'1'))) and t1.CreateTime<=(SELECT DATEADD(Month,-1,DATEADD(s,-1,CONVERT(char(8),DATEADD(Month,1,getdate()),120)+'1')))group by t1.SkuNo,t1.ProductNameselect t1.SkuNo,t1.ProductName,SUM(ArriveQty)as ArrQty from V_PO_OrderItem as t1group by t1.SkuNo,t1.ProductName---商品编号、商品名称、本月进货数量、本月进货单价select t2.SkuNo,t2.ProductName,SUM(t2.ArriveQty)本月进货数量,sum(isnull(t2.Price*t2.ArriveQty,0.00)) / nullif((sum(t2.ArriveQty)),0.00)as 本月进货单价,(SUM(t2.ArriveQty)*(sum(isnull(t2.Price*t2.ArriveQty,0.00)) / nullif((sum(t2.ArriveQty)),0.00))) as 本月进货金额from V_PO_OrderItem as t2where t2.CreateTime>=(SELECT CAST(CONVERT(varchar(10),GETDATE()-datepart(day,GETDATE())+1,120)as datetime)) and t2.CreateTime<=(SELECT dateadd(second,-1,dateadd(month,1,CONVERT(varchar(10),GETDATE()-datepart(day,GETDATE())+1,120)))) group by t2.SkuNo,t2.ProductName ,t2.CreateTime-------------------------------------------------- 系列号(随机生成)这个不会弄 商品编号 SkuNo 商品名称 ProductName 采购价格 Price 上月平均单价 (1) 上月初数量 (2) 上月初金额 (3)=(1)*(2) 本月进货数量 (4) 本月进货单价 (5 本月进货金额 (6)=(4)*(5) 本月平均单价 (7)=(3)+(6)/(2)+(4) 【单价采用加权平均方进行计算 //这个就是(6月30日23点59分59秒以前+本月的)总价格/(6月30日23点59分59秒以前+本月的)总数量---应该是这样的----------------------------------------------------
create proc procname_test@beginDate datetime,@endDate datetimeasbegin select * from test where createdate between @beginDate and @endDate end
[解决办法]
客户选择时间范围,开始时间是上个月的,结束时间是这个月的,那你需求不是有问题了。
[解决办法]
这个表结构不合理啊,如果要以月份来出报表,为什么不加一个yyyymm的列
[解决办法]
create proc P_rep
as
declare @month_cur varchar(6) --当前年月
declare @month_l varchar(6) --上个月
set @month_cur = LEFT(getdate(),4)
set @month_l = LEFT(dateadd(month,1,getdate()),4)
--skuNo 商品编号 productName 商品名称 ArriveQty入库数量 Price 采购价格 RtnQty采购退货数量 --V_PO_OrderItem
create table #rep (id int identity(1,1), --序列号
skuno varchar(60),
ProductName varchar(100),
avgprice_lastmonth numeric(12,2) not null default 0,--上月平均单价
qty_lastmonth int not null default 0,
je_lastmonth numeric(12,2) not null default 0, --上月初金额
qty int not null default 0,
avgprice_cur numeric(12,2) not null default 0, --本月平均单价
je numeric(12,2) not null default 0, --本月金额
avgprice numeric(12,2) not null default 0 --平均单价 )
--上月的数据汇总到临时表#t1
select skuno,ProductName,SUM(ArriveQty - RtnQty) qty,
SUM(ArriveQty*Price - RtnQty*Price) je
into #t1 from V_PO_OrderItem
where LEFT(CreateTime,4) = @month_l
group by skuno,ProductName
--本月的数据汇总到临时表#t2
select skuno,ProductName,SUM(ArriveQty - RtnQty) qty,
SUM(ArriveQty*Price - RtnQty*Price) je
into #t2 from V_PO_OrderItem
where LEFT(CreateTime,4) = @month_cur
group by skuno,ProductName
insert into #rep (skuno,ProductName,qty_lastmonth,je_lastmonth,qty,je)
select ISNULL(t1.skuno,t2.skuno),
isnull(t1.ProductName,t2.ProductName),
ISNULL(t1.qty,0),
ISNULL(t1.je,0),
ISNULL(t2.qty,0),
ISNULL(t2.je,0)
from #t1 t1 full join #t2 t2 on t1.skuno = t2.skuno
update #rep set
avgprice_lastmonth = case qty_lastmonth when 0 then 0 else
ROUND(je_lastmonth/qty_lastmonth,2) end,
avgprice_cur = case qty when 0 then 0 else ROUND(je/qty,2) end,
avgprice = case qty_lastmonth + qty when 0 then 0 else
ROUND((je_lastmonth + JE)/(qty_lastmonth + QTY),2) end
select * from #rep