【续】关于玻璃拼接的算法逻辑

morliz子轩 2019-10-12 08:39:18
请见图:


前期版主大大给出了4块相同尺寸的玻璃拼接的方法,但如果出现上图源图中,有2块玻璃相同尺寸,出现多次时,就会产生BUG。
直接导致,1块玻璃直接拼成了1个BoxCount(木箱)
贴子链接:关于相同记录按条数进行拼接的问题
早期的问贴:求教:关于玻璃当长宽相同时有多条记录时,合并尺寸的方法?


实际上理想的需求是,相同尺寸的玻璃(宽、高相同),2块为1个箱子,不能超过2块。再相同的时候,再打成1个木箱。
如果尺寸没有成双的,就单独打1个箱子。以此依据而来……

请大神们不吝赐教,感谢!
...全文
195 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
morliz子轩 2019-10-19
  • 打赏
  • 举报
回复
3、当出现2块以上相同尺寸时,比如3块,剩余单块的玻璃打成1个,也就是BoxCount =1 首要先考虑的是面积,再就是尺寸。
morliz子轩 2019-10-19
  • 打赏
  • 举报
回复
以下是完整数据源码:

if not object_id(N'Tempdb..#T') is null
	drop table #T
go
create table #T (BOMHeaderID int,Length decimal(10,2),Width decimal(10,2),SndQty decimal(10,2))
insert #T
select 5454,806,385,1.00 union ALL
select 5454,806,385,1.00 union ALL
select 5454,806,385,1.00 union ALL
select 5454,806,385,1.00 union ALL
select 5454,632,1272,1.00 union ALL
select 5454,806,1446,1.00 union ALL

select 6918,605,1322,1.00 union ALL
select 6918,605,1322,1.00 union ALL
select 6918,688,388,1.00 union ALL
select 6918,688,388,1.00 union ALL
select 6918,688,588,1.00 union ALL
select 6918,688,588,1.00 union ALL
select 6918,1055,1420,1.00

go
select *
	,(row_number() over (PARTITION BY BOMHeaderID order by Length)+1)/2 AS rn
	,rtrim(Width) +'x'+ rtrim(Length) AS Size
	,(Length * Width )/1000000 as Area 
from #T
数据源表图: 优先级条件处理是:(从上往下优先) 1、当面积Area 大于1.5 时,直接优先单独打包。也就是BoxCount =1 2、当长、宽尺寸相同时,2条块玻璃打成1个,也就是BoxCount =1
morliz子轩 2019-10-19
  • 打赏
  • 举报
回复
引用 2 楼 二月十六 的回复:
哥,这个测试代码,我发现一个问题。 当4块相同玻璃顺序是乱的,比如,第一条记录位置是1187*536时, rn的序列,就是错位的。 你可以试下 以下是我测试的结果:
纳尼刘君 2019-10-16
  • 打赏
  • 举报
回复
CREATE TABLE T ( id INT identity(1,1), headerid VARCHAR(10), length INT, width INT ) INSERT INTO T(headerid,length,width) VALUES (16915,632,1272), (16915,806,385), (16915,806,385), (16915,806,385), (16915,806,385), (16915,806,1446), (19616,605,1322), (19616,605,1322), (19616,688,588), (19616,688,588), (19616,688,588), (19616,688,588), (19616,688,588), (19616,688,588), (19617,1055,14203); INSERT INTO T(headerid,length,width) VALUES (19616,688,588) CREATE TABLE #temp ( id INT, headerid VARCHAR(10), length INT, width INT, num int ) insert into #temp select *,ROW_NUMBER() over(partition by headerid,length,width order by length) as num from T select id,headerid,length,width, (case when num%2=0 then CONVERT(varchar(100),length)+' x '+CONVERT(varchar(100),width) +' || ' +CONVERT(varchar(100),length)+' x '+CONVERT(varchar(100),width) else CONVERT(varchar(100),length)+' x '+CONVERT(varchar(100),width) end) as calculatedsize , (case when num%2=0 then 2 else 1 end) as snditemqty, 1 as boxcount from #temp a where num%2=0 or num=(select MAX(num) from #temp b where a.headerid=b.headerid and a.length=b.length and a.width=b.width)
二月十六 2019-10-14
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([Length] int,[Width] INT,[Qty] decimal(18,2))
Insert #T
select 427,'1122',1.00 union ALL
select 427,'1122',1.00 union ALL
select 427,'1122',1.00 union ALL
select 427,'1122',1.00 union all
select 552,'536',1.00 union all
select 1187,'536',1.00 union all
select 552,'536',1.00
Go
--测试数据结束
;WITH cte AS (
Select *,(ROW_NUMBER()OVER(ORDER BY Length)+1)/2 AS rn ,RTRIM(Length)+'*'+RTRIM(Width) AS Size FROM #T
)
SELECT rn ,
STUFF(( SELECT '||' + cte.Size
FROM cte
WHERE rn = a.rn
FOR
XML PATH('')
), 1, 2, '') AS Size,
SUM(a.Qty) AS Num,
1 AS Count
FROM cte a
GROUP BY a.rn


morliz子轩 2019-10-14
  • 打赏
  • 举报
回复
没人帮我看下啊。。。我要顶起来 拜托大神帮忙研究一下吧

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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