SqlServer 示例:with as 递归查询、一行转多行

本文通过实例演示了如何在SQLServer中使用`WITH AS`进行递归查询,以及如何将一行数据转换为多行,适用于处理如物料分装等业务场景。

业务场景:
把物料按箱分装,一行转多行

WITH Temp AS (
	SELECT
		1 AS XuHao,--初始序号为1
		T1.Id
	FROM U_SDP1 T1 WHERE T1.DocEntry = @DocEntry
	UNION ALL
	SELECT
		Tm.XuHao+1 AS XuHao,--序号递增
		T1.Id
	FROM Temp Tm INNER JOIN U_SDP1 T1 On Tm.Id = T1.Id WHERE (Tm.XuHao+1)*T1.XQuantity <= T1.Quantity
)
SELECT 
	N'钧茂电子有限公司' AS N'代理商名称',
	T2.WhsName,
	T1.ItemCode AS N'物料编号',
	T1.FrgnName AS N'制造商料号',
	T1.CardItem AS N'客户料号',
	T1.NumAtCard AS N'订单号',
	T1.YPFrgnName AS N'规格描述',
	T0.DocDueDate AS N'交货日期',
	T3.Name AS N'品牌',
	CASE WHEN Tm.XuHao <= T1.Quantity*/T1.XQuantity THEN
		--满箱数量
		CAST(T1.XQuantity AS VARCHAR(20)) +'PCS'
	ELSE
		--最后一箱装不满时的数量
		CAST(T1.Quantity%T1.XQuantity AS VARCHAR(20)) +'PCS'
	END AS N'本箱数量',
	CAST(T1.Quantity AS VARCHAR(20)) + 'PCS' AS N'交货数量',
	--总箱数 = 总数量除以每箱数量再向上取整数 
	CAST(Tm.XuHao AS VARCHAR(20)) +'-'+ CAST(CEILING(T1.Quantity*1.0/T1.XQuantity) AS VARCHAR(20)) AS N'箱序',
	'PCS' AS N'单位',
	T0.CardName AS N'客户名称'
FROM U_OSDP T0
INNER JOIN U_SDP1 T1 ON T0.DOcEn
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值