--------------------求一个SQL,如何计算出这个定单每次结算的上次结余和本次进出情况------------------

雄牛 2018-01-31 09:17:06
是这样,客户有个需求是这样,
有个定单表,还有一个结算表
然后客户每天会用按钮生成一个结算单,结算单号按当天的时间生成.
生成的时候,把上次生成的结算单的的不同货品的,不同规格,生成结余数量和结余金额,插入新记录到结算表中(第一次初始为0),
这样的话,一查看结算表某一单号就知道不同的货品,规格,有多少的结余数量和金额,以及超初多少金额/数量,加了多少金额/数量,剩余多少金额/数量

我曾试着用程序来做逻辑还有是些漏洞,如何实现像结余表一样的数据呢?


***定单表:
结构如下:
货品名 规格 单价 数量 金额 入库日期 结算号
----------------------------------------------------------------------------------------
A货 A-1 20 5 100 2018-1-1 P20180130
A货 A-2 25 6 150 2018-1-1 P20180130
B货 B-1 50 8 400 2018-1-1 P20180130
A货 A-1 30 6 180 2018-1-1 P20180130
B货 B-1 40 5 200 2018-1-2 P20180201
A货 A-1 40 5 200 2018-1-2
A货 A-2 40 5 200 2018-1-2


只处理定单表中那些没有结算号的,
每次生成操作,需要生成如下数据

***结算表
(期初数量 +增加数量=结余数量)

结算号 上次结算号 货品名 规格 期初数量 增加数量 结余数量 期初金额 增加金额 结余金额
------------------------------------------------------------------------------------------------------------------------------------------------
P20180130 A货 A-1 0 11 11 0 280 280
P20180130 A货 A-2 0 6 6 0 150 150
P20180130 B货 B-1 0 8 8 0 400 400
P20180201 P20180130 B货 B-1 8 5 13 400 200 600
.....


...全文
1408 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
keueng 2018-01-31
  • 打赏
  • 举报
回复
按楼主大概的意思理解写法如下,结果和楼主结算表样表一致

-- 1.录入定单表
IF OBJECT_ID(N'tempdb..#定单表')IS NOT NULL
	DROP TABLE #定单表
GO

CREATE TABLE #定单表
(
	货品名		VARCHAR(11)
	,规格		VARCHAR(11)
	,单价		FLOAT
	,数量		INT
	,金额		FLOAT
	,入库日期	DATE
	,结算号		VARCHAR(11)
)

INSERT INTO #定单表 VALUES
('A货','A-1',20,5,100,'2018-1-1','P20180130'),
('A货','A-2',25,6,150,'2018-1-1','P20180130'),
('B货','B-1',50,8,400,'2018-1-1','P20180130'),
('A货','A-1',30,6,180,'2018-1-1','P20180130');

-- 2.由定单表生成结算表
IF OBJECT_ID('tempdb..#结算表') IS NOT NULL
	DROP TABLE #结算表
GO

SELECT	结算号
		, CAST('' AS VARCHAR(11)) AS 上次结算单号
		, 货品名
		, 规格
		, 0						AS 期初数量
		, SUM(数量)				AS 增加数量
		, 0 + SUM(数量)			AS 结余数量
		, 0						AS 期初金额
		, SUM(金额)				AS 增加金额
		, 0 + SUM(金额)			AS 结余金额
INTO	#结算表
FROM	#定单表
GROUP BY
		结算号
		, 货品名
		, 规格;
		
-- 3.向结算表中录入新定单数据
WITH CTEB
	AS
	(
		SELECT	'B货'			AS 货品名
				, 'B-1'			AS 规格
				, 40			AS 单价
				, 5				AS 数量
				, 200			AS 金额
				,'2018-1-2'		AS 入库日期
				,'P20180201'	AS 结算号
	)
	, CTEC
	AS
	(
		SELECT	CTEB.结算号						AS 结算号
				, CTEA.结算号					AS 上次结算单号
				, CTEB.货品名					AS 货品名
				, CTEB.规格						AS 规格
				, CTEA.结余数量				AS 期初数量
				, CTEB.数量						AS 增加数量
				, CTEA.结余数量 + CTEB.数量	AS 结余数量
				, CTEA.结余金额				AS 期初金额
				, CTEB.金额						AS 增加金额
				, CTEA.结余金额 + CTEB.金额	AS 结余金额
		FROM	#结算表 AS CTEA
				INNER JOIN CTEB
					ON	   CTEA.货品名 = CTEB.货品名
					   AND CTEA.规格 = CTEB.规格
	)
INSERT	INTO #结算表 
SELECT	TOP 1 *
FROM	CTEC
ORDER BY
		上次结算单号 DESC;

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧