首先:我在之前提出的问题中找到了一些可能的答案,但是我在让它们正常工作时遇到了问题。我知道这个问题已经被问到,但答案总是有效的代码,对所使用的方法几乎没有解释。
所以:我必须找出客户何时达到 VIP 状态,也就是他的订单值(value)超过 50 000 时。我有 2 个表:一个包含 orderid、customerid 和 orderdate,第二个包含 orderid、数量和单价。
我写的查询的结果应该是 3 列宽,一个是 customerid,一个是 true/false,名为“是 VIP?”,第三个是获取 VIP 状态的日期(即下单日期)与前面的相加得出的结果超过 50 000)-如果客户没有达到 VIP 状态,最后一个应该为空
select o.customerid, sum(od.quantity*od.unitprice),
case
when sum(od.quantity*od.unitprice)>50000 then 'VIP'
else 'Normal'
end as 'if vip'
from
orders o join [Order Details] od on od.orderid=o.orderid
group by o.customerid
就我得到的代码而言,它返回客户的状态,现在我需要获取发生这种情况的日期。
.
最佳答案
您可以使用窗口函数轻松计算运行总计:
select o.customerid,
o.orderdate,
sum(od.quantity*od.unitprice) over (partition by o.customerid order by orderdate) as running_sum,
from orders o
join Order_Details od on od.orderid = o.orderid
order by customer_id, orderdate;
现在您需要找到一种方法来检测运行总数超过阈值的第一行:
一旦达到阈值,以下查询开始以降序方式对行进行编号。这反过来意味着编号为 1 的行是第一个越过阈值的行:
with totals as (
select o.customerid,
o.orderdate,
sum(od.quantity*od.unitprice) over (partition by o.customerid order by orderdate) as running_sum,
case
when
sum(od.quantity*od.unitprice) over (partition by o.customerid order by orderdate) > 50000 then row_number() over (partition by o.customerid order by orderdate desc)
else 0
end as rn
from orders o
join Order_Details od on od.orderid = o.orderid
)
select *
from totals
where rn = 1
order by customerid;
SQLFiddle 示例:http://sqlfiddle.com/#!6/a7f18/3
关于sql - 找出总和值何时到达 SQL 中的某个检查点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33940556/