编辑
根据您现在在问题中提供的其他信息,我建议使用以下 SQL:
select
t0.ref,
t0.[delivery week],
nz(t3.q1,0) - nz(t6.q2,0) as QtyDiff
from
(
tableofdelivery t0
left join
(
select
t1.ref, t1.[delivery week], sum(t1.qty) as q1
from
tableofdelivery t1
where
t1.[reporting week] =
(
select max(t2.[reporting week])
from tableofdelivery t2
where t2.ref = t1.ref
)
group by
t1.ref, t1.[delivery week]
) t3 on t0.ref = t3.ref and t0.[delivery week] = t3.[delivery week]
) left join
(
select
t4.ref, t4.[delivery week], sum(t4.qty) as q2
from
tableofdelivery t4
where
t4.[reporting week] <
(
select max(t5.[reporting week])
from tableofdelivery t5
where t5.ref = t4.ref
)
group by
t4.ref, t4.[delivery week]
) t6 on t0.ref = t6.ref and t0.[delivery week] = t6.[delivery week]
group by
t0.ref, t0.[delivery week], nz(t3.q1,0) - nz(t6.q2,0)
原答案
假设我已经正确理解了您希望获得的结果,我建议使用以下代码:
select
t0.ref,
t0.[delivery week],
nz(t2.qty, 0) - t0.qty as qtydiff
from
(
tableofdelivery t0 inner join
(
select t.ref, t.[delivery week] as dw, min(t.[reporting week]) as rw
from tableofdelivery t
group by t.ref, t.[delivery week]
) t1 on
t0.ref = t1.ref and
t0.[delivery week] = t1.dw and
t0.[reporting week] = t1.rw
)
left join tableofdelivery t2 on
t1.ref = t2.ref and
t1.dw = t2.[delivery week] and
t1.rw <> t2.[reporting week]
order by
t0.ref,
t0.[delivery week]
对于您提供的示例数据:
+----------------+---------------+---------------+-----+
| reporting week | ref | delivery week | qty |
+----------------+---------------+---------------+-----+
| 2018-37 | DTR0000182433 | 2018-31 | 19 |
| 2018-41 | DTR0000182433 | 2018-31 | 20 |
| 2018-37 | DTR0000182433 | 2018-33 | 50 |
| 2018-41 | DTR0000182433 | 2018-33 | 13 |
| 2018-37 | DTR0000182433 | 2018-35 | 50 |
| 2018-37 | DTR0000182433 | 2018-39 | 100 |
| 2018-41 | DTR0000182433 | 2018-43 | 13 |
+----------------+---------------+---------------+-----+
产生以下结果:
+---------------+---------------+---------+
| ref | delivery week | qtydiff |
+---------------+---------------+---------+
| DTR0000182433 | 2018-31 | 1 |
| DTR0000182433 | 2018-33 | -37 |
| DTR0000182433 | 2018-35 | -50 |
| DTR0000182433 | 2018-39 | -100 |
| DTR0000182433 | 2018-43 | -13 |
+---------------+---------------+---------+
这里,最里面的子查询首先获取每个delivery week和ref组合的最早的reporting week记录。然后从与给定delivery week 和ref 组合的其他(非最小)记录相关联的qty 中减去与此最小记录相关联的qty。
或者,根据您的后续 cmets 反转计算,您可以尝试以下操作:
select
t0.ref,
t0.[delivery week],
t0.qty - nz(t2.qty, 0) as qtydiff
from
(
tableofdelivery t0 inner join
(
select t.ref, t.[delivery week] as dw, max(t.[reporting week]) as rw
from tableofdelivery t
group by t.ref, t.[delivery week]
) t1 on
t0.ref = t1.ref and
t0.[delivery week] = t1.dw and
t0.[reporting week] = t1.rw
)
left join tableofdelivery t2 on
t1.ref = t2.ref and
t1.dw = t2.[delivery week] and
t1.rw > t2.[reporting week]
order by
t0.ref,
t0.[delivery week]
对于您提供的示例数据:
+----------------+---------------+---------------+-----+
| reporting week | ref | delivery week | qty |
+----------------+---------------+---------------+-----+
| 2018-37 | DTR0000182433 | 2018-31 | 19 |
| 2018-41 | DTR0000182433 | 2018-31 | 20 |
| 2018-37 | DTR0000182433 | 2018-33 | 50 |
| 2018-41 | DTR0000182433 | 2018-33 | 13 |
| 2018-37 | DTR0000182433 | 2018-35 | 50 |
| 2018-37 | DTR0000182433 | 2018-39 | 100 |
| 2018-41 | DTR0000182433 | 2018-43 | 13 |
+----------------+---------------+---------------+-----+
产生以下结果:
+---------------+---------------+---------+
| ref | delivery week | qtydiff |
+---------------+---------------+---------+
| DTR0000182433 | 2018-31 | 1 |
| DTR0000182433 | 2018-33 | -37 |
| DTR0000182433 | 2018-35 | 50 |
| DTR0000182433 | 2018-39 | 100 |
| DTR0000182433 | 2018-43 | 13 |
+---------------+---------------+---------+