好的 - 让我解释一下。我有一系列行 - 行有“重量”值和“数量”和“率” - 其他但现在关注这些... 我需要做的是分割行 - 我在下面基于数量来完成 - 所以对于一个有数量>的行。 1 - 为每个qty值复制一行。 因此,现在它们全部分开 - 我需要确定哪个具有最高的“重量” - 然后我需要将该速率保持在100%。所有其他人将是/ /。
然后 - 最后 - 我需要将行重新卷起来 - 所以所有类似的ID都会以汇总的费率折叠 - 所以回到单行的佣金率
/*
--create numbers table if don't already have one...
select top 1000000 row_number() over(order by t1.number) as N
into dbo.Numbers
from master..spt_values t1
cross join master..spt_values t2
*/
DECLARE @table TABLE
(
id int IDENTITY(1,1) ,
code varchar(10) ,
codeStatus varchar ,
qty int ,
rate money ,
codeWeight float ,
comment varchar(100)
)
INSERT INTO @table SELECT '12345' , 'T' , 3 , 375.86 , 5.6589 , NULL
INSERT INTO @table SELECT '45678' , 'T' , 2 , 2 , 4.0000 , NULL
INSERT INTO @table SELECT '11223' , 'T' , 1 , 2 , 3.0000 , NULL
SELECT t.id ,
t.code ,
t.qty ,
t.rate ,
t.codeWeight ,
n.N
FROM @table t
JOIN dbo.Numbers n on n.N <= t.qty
ORDER BY id ,
N
答案 0 :(得分:0)
这是一种在不需要数字表的情况下进行分解的方法:
http://sqlfiddle.com/#!6/93b09/1
with cte as
(
SELECT id, code, qty, rate, codeWeight, qty N
FROM myTable t
union all
select id, code, qty, rate, codeWeight, N - 1
from cte
where N > 1
)
SELECT id, code, qty, rate, codeWeight, N
FROM cte
ORDER BY id, N
如果我已经正确理解了接下来的步骤,那么这应该是你之后做的......
http://sqlfiddle.com/#!6/93b09/4
声明@temp表(id int,代码varchar(10),qty int,rate money,codeWeight float,N int)
;with cte as
(
SELECT id, code, qty, rate, codeWeight, qty N
FROM myTable t
union all
select id, code, qty, rate, codeWeight, N - 1
from cte
where N > 1
)
insert @temp
SELECT id, code, qty, rate, codeWeight, N
FROM cte
ORDER BY id, N
update t
set rate = t.rate / 2.0
from @temp t
inner join myTable m on m.id = t.id
and t.qty < m.qty
select id, code, max(qty) qty, sum(rate) rate, codeWeight
from @temp
group by id, code, codeWeight
<强>更新强>
根据评论中的讨论,这个SQL应该做你需要的一切:
http://sqlfiddle.com/#!6/93b09/13
select id
, code
, codeStatus
, qty
, case (row_number() over (order by codeWeight desc))
when 1 then rate + case when qty > 0 then qty-1 else 0 end * rate / 2.0
else qty * rate / 2.0
end rate
, codeWeight
, comment
from myTable
即。重量值最大的项目返回一个由全部费率单位组成的费率,再加上半价的剩余单位。
所有其他项目的费率均为半价的全部数量。