根据订单调整各行的值然后汇总

时间:2014-07-30 23:18:29

标签: sql sql-server tsql

好的 - 让我解释一下。我有一系列行 - 行有“重量”值和“数量”和“率” - 其他但现在关注这些... 我需要做的是分割行 - 我在下面基于数量来完成 - 所以对于一个有数量>的行。 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

1 个答案:

答案 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

即。重量值最大的项目返回一个由全部费率单位组成的费率,再加上半价的剩余单位。

所有其他项目的费率均为半价的全部数量。