设计班次

原贴: 点击打开链接

USE tempdb
GO
IF OBJECT_ID('bucket_data') IS NOT NULL DROP TABLE bucket_data
IF OBJECT_ID('schedule_data') IS NOT NULL DROP TABLE schedule_data
IF OBJECT_ID('schedule_bucket_mid') IS NOT NULL DROP TABLE schedule_bucket_mid
--1. 桶表
CREATE TABLE bucket_data (
	bucketNO VARCHAR(2) NOT NULL PRIMARY KEY,	--桶号
	bucketWeight INT NOT NULL			--桶重
)
--2. 班次表
CREATE TABLE schedule_data (
	scheduleId INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
	currDate DATETIME NOT NULL,		--当前日期
	flag INT NOT NULL				--班次 早班1,晚班2
)
GO
CREATE UNIQUE NONCLUSTERED INDEX IX_schedule_data_currDate_flag ON schedule_data(currDate,flag)

--3. 班次桶中间表
CREATE TABLE schedule_bucket_mid (
	id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
	scheduleId INT NOT NULL,		--班次ID
	bucketNO VARCHAR(2) NOT NULL,	--桶号
	weight INT NOT NULL				--总重
)

------- 插入测试数据
SET NOCOUNT ON
INSERT INTO bucket_data VALUES('A',5)
INSERT INTO bucket_data VALUES('B',5)
INSERT INTO bucket_data VALUES('C',2)
INSERT INTO bucket_data VALUES('D',3)
INSERT INTO bucket_data VALUES('E',3)
INSERT INTO bucket_data VALUES('F',2)

INSERT INTO schedule_data(currDate,flag) VALUES('2017-10-12', 1)
INSERT INTO schedule_data(currDate,flag) VALUES('2017-10-12', 2)
INSERT INTO schedule_data(currDate,flag) VALUES('2017-10-13', 1)

INSERT INTO schedule_bucket_mid(scheduleId,	bucketNO,[weight]) VALUES(1,'A',10)
INSERT INTO schedule_bucket_mid(scheduleId,	bucketNO,[weight]) VALUES(1,'B',15)
INSERT INTO schedule_bucket_mid(scheduleId,	bucketNO,[weight]) VALUES(1,'C',20)
INSERT INTO schedule_bucket_mid(scheduleId,	bucketNO,[weight]) VALUES(2,'A',20)
INSERT INTO schedule_bucket_mid(scheduleId,	bucketNO,[weight]) VALUES(2,'B',30)
INSERT INTO schedule_bucket_mid(scheduleId,	bucketNO,[weight]) VALUES(2,'D',20)
INSERT INTO schedule_bucket_mid(scheduleId,	bucketNO,[weight]) VALUES(2,'E',10)
INSERT INTO schedule_bucket_mid(scheduleId,	bucketNO,[weight]) VALUES(2,'F',10)
INSERT INTO schedule_bucket_mid(scheduleId,	bucketNO,[weight]) VALUES(3,'B',50)
INSERT INTO schedule_bucket_mid(scheduleId,	bucketNO,[weight]) VALUES(3,'C',30)
INSERT INTO schedule_bucket_mid(scheduleId,	bucketNO,[weight]) VALUES(3,'D',40)

--结果视图1
IF OBJECT_ID('view_result') IS NOT NULL DROP VIEW view_result
GO
CREATE VIEW view_result
AS
SELECT a.currDate AS [日期]
	,CASE a.flag WHEN 1 THEN '早班' WHEN 2 then '晚班' END AS [班次]
	,STUFF( (SELECT ','+b.bucketNO 
			 FROM schedule_bucket_mid AS B WHERE b.scheduleId=a.scheduleId FOR XML PATH('')),1,1,'' ) AS [桶号]
	,STUFF( (SELECT ','+CAST(b.[weight] AS VARCHAR(50)) 
			 FROM schedule_bucket_mid AS B WHERE b.scheduleId=a.scheduleId FOR XML PATH('')),1,1,'' ) AS [总重]
	,STUFF( (SELECT ','+CAST(c.bucketWeight AS VARCHAR(50)) 
			 FROM schedule_bucket_mid AS B INNER JOIN bucket_data AS c ON b.bucketNO=c.bucketNO 
			 WHERE b.scheduleId=a.scheduleId FOR XML PATH('')),1,1,'' ) AS [桶重]
	FROM schedule_data AS A
GO
--结果视图2
--每个班次的实际产量
IF OBJECT_ID('view_result2') IS NOT NULL DROP VIEW view_result2
GO
CREATE VIEW view_result2
AS
WITH cte AS (
SELECT ROW_NUMBER() OVER (PARTITION BY b.bucketNO ORDER BY a.currDate,a.flag) AS rid
,a.scheduleId
,a.currDate
,a.flag
,b.bucketNO
,b.[weight]
FROM schedule_data A INNER JOIN schedule_bucket_mid AS B ON a.scheduleId=b.scheduleId
)
,cte2 AS(
SELECT a.scheduleId,a.currDate,a.flag,a.bucketNO,a.[weight]-ISNULL((
	SELECT b.[weight] FROM cte AS b WHERE a.rid=b.rid+1 AND a.bucketNO=b.bucketNO
),0) AS [weight]
FROM cte A
)
SELECT a.currDate AS [日期]
,CASE a.flag WHEN 1 THEN '早班' WHEN 2 then '晚班' END AS [班次]
,STUFF(( SELECT ','+b.bucketNO FROM cte2 b WHERE a.scheduleId=b.scheduleId FOR XML PATH('') ),1,1,'') AS [桶号]
,STUFF(( SELECT ','+CAST(b.[weight] AS VARCHAR(50)) FROM cte2 b WHERE a.scheduleId=b.scheduleId FOR XML PATH('') ),1,1,'') AS [实际产量]
,STUFF(( SELECT ','+CAST(c.bucketWeight AS VARCHAR(50)) FROM cte2 b INNER JOIN bucket_data AS c ON c.bucketNO=b.bucketNO 
         WHERE a.currDate=b.currDate AND a.flag=b.flag FOR XML PATH('') ),1,1,'') AS [桶重]
FROM schedule_data AS a
GO

SELECT * FROM view_result
/*
日期                    班次   桶号        总重                 桶重
----------------------- ---- ----------   ------------------  -------------
2017-10-12              早班   A,B,C         10,15,20           5,5,2
2017-10-12              晚班   A,B,D,E,F     20,30   ,20,10,10  5,5,3,3,2
2017-10-13              早班   B,C,D            50,30,40        5,2,3
*/
SELECT * FROM view_result2
/*
日期                    班次   桶号        实际产量             桶重
----------------------- ---- ----------   ------------------  -------------
2017-10-12              早班   A,B,C         10,15,20           5,5,2
2017-10-12              晚班   A,B,D,E,F     10,15,   20,10,10  5,5,3,3,2
2017-10-13              早班   B,C,D            20,10,20        5,2,3
*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值