求教:关于玻璃当长宽相同时有多条记录时,合并尺寸的方法?

morliz子轩 2019-06-09 09:59:28
原表数据和最终实现结果如下图:


不知道该如何实现,把它合并成一条记录到是比较简单。
请教大神,感谢!
...全文
216 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ダ雨夹雪リ 2019-06-09
  • 打赏
  • 举报
回复
我看你的数据,1159-554和1203*658的都是有4条(F1到F4),但是你的结果SlicesNum和BoxCount是怎么计算来的呢?
难道是每箱多少共多少箱的意思?
morliz子轩 2019-06-09
  • 打赏
  • 举报
回复

(1 + row_number() over (partition by a.BOMHeaderID  order by a.DistrictLength))/2
可以将,相同尺寸记录,按2条的方式进行排序,从而进行最终的合并处理。 非常感谢。 其实这个项目,还有非常多样化的情况。 比如有以下几种情况: 条件:当Area面积<=1.5 (m2)以内,计算以下打包规则: 1、长、宽相同时; 2、长相同,宽不同时, ABS[宽差值] / MAX[宽] < (2/3) --小于最大宽面的三分之二 3、宽相同,长不同时, ABS[长差值] / MAX[长 < (2/3) --小于最大长度的三分之二 4、图号(SingleSharpName)包含A的,不打包。 5、超1.5时,单独打包。 请教一下,象这种多样性情况的需求,考虑维护的方便性,如何实现把它写成函数会不会好些? 特别是上述4、5点可能会设定成开关方式。 再次感谢!!
morliz子轩 2019-06-09
  • 打赏
  • 举报
回复
引用 5 楼 雨夹雪 的回复:
[code=sql]
你的方案非常好,最核心的问题,就是:
ダ雨夹雪リ 2019-06-09
  • 打赏
  • 举报
回复
图片呢,见鬼
ダ雨夹雪リ 2019-06-09
  • 打赏
  • 举报
回复
ダ雨夹雪リ 2019-06-09
  • 打赏
  • 举报
回复

CREATE TABLE #T
(
id INT,
headerid VARCHAR(10),
length INT,
width INT,
singleshap VARCHAR(10)
)

INSERT INTO #T VALUES
(1,16915,1159,554,'C1-F1'),
(2,16915,1159,554,'C1-F2'),
(3,16915,1159,554,'C1-F3'),
(4,16915,1159,554,'C1-F4')
INSERT INTO #T VALUES
(5,19616,1203,658,'C1-F1'),
(6,19616,1203,658,'C1-F2'),
(7,19616,1203,658,'C1-F3')


;
WITH ct
AS
(
SELECT
headerid,
CONVERT(varchar(10),length) AS length,
CONVERT(varchar(10),width) AS width,
(1+ROW_NUMBER() OVER(PARTITION BY headerid ORDER BY singleshap))/2 AS x
FROM #T
)
SELECT
STUFF( (SELECT '||'+width+'x'+ct.length FROM ct WHERE ct.headerid=A.headerid AND x=A.x
FOR XML PATH('')
) ,1,2,'') AS Caculatedsize, COUNT(1) AS SlicesNum, 1 AS BoxCount FROM CT A
GROUP BY A.headerid,x
ORDER BY headerid



morliz子轩 2019-06-09
  • 打赏
  • 举报
回复
晕,咋贴上图的结果,没显示,补发:
morliz子轩 2019-06-09
  • 打赏
  • 举报
回复
当相同尺寸,超过2条记录时,计算为下一个木箱。 现在问题,就出在: 4片相同尺寸的玻璃,按我之前写的语句:

SELECT STUFF((SELECT '||'+ltrim(b.DistrictWidth)+'x'+ltrim(b.DistrictLength) FROM ctea AS b 
        WHERE a.DistrictLength=b.DistrictLength AND a.flag=b.flag FOR XML PATH('')),1,2,'') AS CalculatedSize
,count(SingleShapeName) AS SlicesNum
,1 AS BoxCount
FROM ctea AS a WHERE a.flag not in (1,2,3)
GROUP BY a.DistrictLength,a.flag
结果就成了,4片玻璃,打包在1个木箱中。 上面SQL中flag标识,只针对尺寸相同的玻璃,做了一个相同的标记。语句是这样的: 最终错误的合并成:
morliz子轩 2019-06-09
  • 打赏
  • 举报
回复
它是这样的。一张记录,代表一片玻璃。 当玻璃的长、宽尺寸相同时,按2片为一个单位,包装在一个木箱(BoxCount =1)

27,579

社区成员

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

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