关于SQL SERVER 的物料计算的问题,是真的不知道该怎么写语句了......

匚匚.. 2021-01-09 11:34:17
请教一个问题.关于SQLSERVER的物料优化.
不知道SQL能否做到这一点.或者有没有其他更简洁的快速的办法.

先谢谢大家.
问题如图:
附图片:


table a 的行数是不确定的.length是订单使用了的长度.但该物品原料的尺寸是3000MM,怎么样的到右表?注意,这并不是简单的SUM求和然后除以3000MM就能得出的.因为部分尺寸不足3000,也就是LENGTH的和值不大于3000
...全文
216 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
shoppo0505 2021-01-12
  • 打赏
  • 举报
回复
这个是满足性问题,数据库做不了,有特定的、java类库做这个
锟斤拷锟斤拷 2021-01-11
  • 打赏
  • 举报
回复
引用 1 楼 锟斤拷锟斤拷 的回复:
https://bbs.csdn.net/topics/398539624 感觉可以参考一下#5的做法
思路就是参考雨夹雪大佬的算法,先求出全部解,再根据sumlen降序排序 然后查出解的ID都是第一次出现的组合,比如第一行的解里出现了1和6,就过滤掉后面含有1或者6的解,反正最后结果看着挺像那么回事的
锟斤拷锟斤拷 2021-01-11
  • 打赏
  • 举报
回复

CREATE TABLE #A(
[LENGTH] INT
)
INSERT INTO #A VALUES (860),(400),(1510),(2300),(870),(1080),(700)
;
WITH ct1 AS
(SELECT *,CONVERT(VARCHAR(MAX),ROW_NUMBER() OVER (ORDER BY LENGTH DESC)) AS ID FROM #A),
ct AS
(SELECT * ,[LENGTH] AS SUMLEN,CONVERT(VARCHAR(max),ID) AS RESULT FROM ct1 WHERE [LENGTH]<=3000 
UNION ALL 
SELECT b.*,B.LENGTH+a.SUMLEN,A.RESULT+','+b.id  FROM ct a INNER JOIN CT1 b ON b.id >= a.id AND a.SUMLEN+b.LENGTH<=3000  
AND CHARINDEX(b.id,RESULT)=0
),
ct2 AS
(SELECT RESULT,SUMLEN,ROW_NUMBER() OVER(ORDER BY SUMLEN DESC) ID1 FROM ct),
CT3 AS
(SELECT TOP 1 *,A.RESULT RES FROM CT2 A ORDER BY A.SUMLEN DESC
UNION ALL
SELECT A.*,
CASE WHEN EXISTS(SELECT 1 FROM XXSPLIT(A.RESULT,',') AA INNER JOIN XXSPLIT(B.RES,',') BB ON AA.VALUE = BB.VALUE) 
THEN B.RES
ELSE A.RESULT+','+B.RES
END 
FROM CT2 A,CT3 B WHERE A.ID1=B.ID1+1
)
SELECT XX.RESULT,SUMLEN FROM (
SELECT *,ROW_NUMBER() OVER(PARTITION BY RES ORDER BY SUMLEN DESC) ID2 FROM CT3) XX WHERE XX.ID2 = 1

DROP TABLE #A
参考了RINK_1和雨夹雪两位大佬的代码 那个xxsplit()就是string_split(),我的版本没有那个函数


create function xxsplit(@sql varchar(MAX),@xx varchar(20))
returns @temp table(value varchar(20))
as
begin
declare @i int
set @i=charindex(@xx,@sql)
while @i>=1
begin
insert @temp values(left(@sql,@i-1))
set @sql=substring(@sql,@i+1,len(@sql)-@i)
set @i=charindex(@xx,@sql)
end
insert into @temp values(@sql)
return
end
RINK_1 2021-01-10
  • 打赏
  • 举报
回复
想不出啥好办法,试试下面的,估计会挺慢的


 WITH CTE_1
 AS
 (SELECT *,ROW_NUMBER() OVER (ORDER BY LENGTH) AS ID FROM #T),
 
 CTE_2
 AS
 (SELECT *,CAST(ID AS VARCHAR) AS ID_GROUP,LENGTH AS SUBTOTAL FROM CTE_1
  UNION ALL
  SELECT A.*,CAST(B.ID_GROUP+','+CAST(A.ID AS VARCHAR) AS VARCHAR),A.LENGTH+B.SUBTOTAL 
  FROM CTE_1 AS A
  JOIN CTE_2 AS B ON A.ID>B.ID
  WHERE A.LENGTH+B.SUBTOTAL<=3000)
 
SELECT * INTO #A FROM CTE_2
 
SELECT *,ROW_NUMBER() OVER (ORDER BY LENGTH) AS ID INTO #B FROM #T

SELECT * INTO #C FROM #A WHERE 1=0

WHILE EXISTS (SELECT 1 FROM #A)

BEGIN 

INSERT INTO #C
SELECT TOP 1 A.* 
FROM #A AS A
JOIN #B AS B ON ','+A.ID_GROUP+',' LIKE '%,'+CAST(B.ID AS VARCHAR)+',%'
ORDER BY A.SUBTOTAL DESC

DELETE #A
FROM #A AS A
JOIN #B AS B ON ','+A.ID_GROUP+',' LIKE '%,'+CAST(B.ID AS VARCHAR)+',%'
WHERE EXISTS (SELECT 1 FROM #C WHERE ','+ID_GROUP+',' LIKE '%,'+CAST(B.ID AS VARCHAR)+',%')

END

SELECT * FROM #C

DROP TABLE #A
DROP TABLE #B
DROP TABLE #C
锟斤拷锟斤拷 2021-01-09
  • 打赏
  • 举报
回复
https://bbs.csdn.net/topics/398539624 感觉可以参考一下#5的做法
匚匚.. 2021-01-09
  • 打赏
  • 举报
回复
引用 1 楼 锟斤拷锟斤拷 的回复:
https://bbs.csdn.net/topics/398539624 感觉可以参考一下#5的做法
#5的做法是都配对了.但是没有返回唯一值,他的那个是多个组合,没有考虑尺寸的不可重复性.
可对物料进行出入库登记、查询、统计等操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.SqlClient; using System.Windows.Forms; namespace FORU_SMS_.BaseClass { public class DataClass { BaseClass.DataConn Dconn = new DataConn(); SqlDataAdapter Mysda; DataSet Myds; DataTable Mydt; SqlCommand SqlCom; //返回一个DataSet public DataSet GetDataSet(string sql, string dt) { Mysda = new SqlDataAdapter(sql, Dconn.OpenConn()); Myds = new DataSet(); Mysda.Fill(Myds, dt); return Myds; } //绑定ComboBox控件 public void BindComboBox(string sql, string dt, string Par_Name, ComboBox cbox) { Myds = GetDataSet(sql, dt); cbox.DataSource = Myds.Tables[dt]; cbox.DisplayMember = Par_Name; } //执行SQL语句,无返回值 public void ExecuteSql(string sql) { try { SqlCom = new SqlCommand(sql, Dconn.OpenConn()); SqlCom.ExecuteNonQuery(); } catch (Exception e) { throw new Exception(e.Message); } finally { Dconn.CloseConn(); } } //验证用户登陆 public bool ChkLogin(string txtUser, string txtPass) { bool strEnter = false; SqlCom = new SqlCommand("select count(*) from SMS_User where UserName=@txtUser AND Password=@txtPass", Dconn.OpenConn()); SqlParameter para = new SqlParameter("@txtUser",SqlDbType.VarChar,20); para.Value = txtUser; SqlCom.Parameters.Add(para); para = new SqlParameter("@txtPass", SqlDbType.VarChar, 20); para.Value = txtPass; SqlCom.Parameters.Add(para); int intCount = Convert.ToInt32(SqlCom.ExecuteScalar()); if (intCount > 0) { strEnter = true; } else { strEnter = false; } return strEnter; } public SqlDataReader GetRead(string sql) { SqlCom = new SqlCommand(sql, Dconn.OpenConn()); SqlDataReader sqlRead = SqlCom.ExecuteReader(CommandBehavior.CloseConnection); return sqlRead; } public DataTable GetDataTable(string sql) { SqlCom = new SqlCommand(sql, Dconn.OpenConn()); Mydt = new DataTable(); Mysda = new SqlDataAdapter(); try { Mysda.SelectCommand = SqlCom; Mysda.Fill(Mydt); } catch (Exception) { } finally { Dconn.CloseConn(); } return Mydt; } private bool isNumber(string s) { int Flag = 0; char[] str = s.ToCharArray(); for (int i = 0; i 0) { return true; } else { return false; } } public void saveGoods(AddGoods _Add) { string sql = ""; sql = sql "insert into SMS_Goods(GoodsID,GoodsName,StoreName,SupName,SpecName,UnitName,GoodsNum,GoodsPrice,GoodsAPrice,GoodsPeople,GoodsRemarks) values (@GoodsID,@GoodsName,@StoreName,@SupName,@SpecName,@UnitName,@GoodsNum,@GoodsPrice,@GoodsAPrice,@GoodsPeople,@GoodsRemarks)"; SqlCom = new SqlCommand(sql,Dconn.OpenConn()); Mysda = new SqlDataAdapter(); Mysda.SelectCommand = SqlCom; SqlCom.Parameters.Add("@GoodsID", SqlDbType.VarChar, 20, "GoodsID").Value = _Add.GoodsID; SqlCom.Parameters.Add("@GoodsName", SqlDbType.VarChar, 50, "GoodsName").Value = _Add.GoodsName; SqlCom.Parameters.Add("@StoreName", SqlDbType.VarChar, 50, "StoreName").Value = _Add.StoreName; SqlCom.Parameters.Add("@SupName", SqlDbType.VarChar, 50, "SupName").Value = _Add.SupName; SqlCom.Parameters.Add("@UnitName", SqlDbType.VarChar, 10, "UnitName").Value = _Add.UnitName; SqlCom.Parameters.Add("@GoodsNum", SqlDbType.Int, 4, "GoodsNum").Value = _Add.GoodsNum; SqlCom.Parameters.Add("@SpecName", SqlDbType.VarChar, 50, "SpecName").Value = _Add.SpecName; SqlCom.Parameters.Add("@GoodsPrice", SqlDbType.Float, 10, "GoodsPrice").Value = _Add.GoodsPrice; SqlCom.Parameters.Add("@GoodsAPrice", SqlDbType.Float, 10, "GoodsAPrice").Value = _Add.GoodsAPrice; SqlCom.Parameters.Add("@GoodsPeople", SqlDbType.VarChar, 20, "GoodsPeople").Value = _Add.GoodsPeople; SqlCom.Parameters.Add("@GoodsRemarks", SqlDbType.VarChar, 50, "GoodsRemarks").Value = _Add.GoodsRemarks; try { SqlCom.ExecuteNonQuery(); } catch (Exception) { } finally { Dconn.CloseConn(); } } } }
最新明嘉新材料公司仓库管理的设计和实现Jsp.zip是一个针对明嘉新材料公司定制的仓库管理系统项目。该项目使用JSP(Java Server Pages)作为后端技术,结合了HTML、CSS、JavaScript等前端技术以及MySQL数据库进行开发。 以下是对该系统的主要功能和特点的介绍: 1. **用户角色定义**:系统可能包含多种用户角色,如仓库管理员、库存管理人员、审核人员等,每种角色都有其特定的操作权限和功能模块。 2. **仓库信息管理**:系统提供了仓库信息的录入、查询、修改和删除等基本功能,包括仓库的位置、容量、存储条件等信息。 3. **库存管理**:库存管理是仓库管理系统的核心功能之一。系统可能提供了对库存物品的入库、出库、盘点、调拨等操作的管理,以及库存数量的实时监控和报警。 4. **物料信息管理**:系统可能提供了对物料基本信息的管理,如物料的名称、规格型号、单位、分类等,方便库存管理人员快速了解物料情况。 5. **报表统计**:系统可能提供了多种报表统计功能,如库存明细报表、库存汇总报表、入库明细报表、出库明细报表等,帮助管理层了解仓库的整体情况。 6. **安全性设计**:系统可能包含了必要的安全措施,如用户身份验证和访问控制,以确保数据的安全性和系统的可靠性。 7. **界面友好**:使用JSP开发的前端界面通常是用户友好的,它能提供良好的用户体验和交互设计,使得用户能够轻松地操作系统。 8. **技术文档**:项目可能会提供详细的技术文档和使用说明,帮助开发者理解系统的架构和开发细节,便于进行后续的维护和升级。 9. **模块化设计**:系统可能被设计成模块化的结构,便于扩展和维护。例如,可以分为仓库模块、库存模块、报表模块等,每个模块都有其独立的功能和责任。 10. **数据处理**:后端服务可能使用了JDBC和SQL语句来处理数据库操作,提高了数据处理的效率和可靠性。 综上所述,这个资源包适合计算机科学与技术专业的学生、Web开发人员、项目经理以及对仓库管理系统开发感兴趣的人士使用。通过这些资料,用户可以了解到如何构建一个高效、现代化的仓库管理系统,并且可以作为一个实用的案例来学习JSP在实际应用中的使用。

22,210

社区成员

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

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