首先:我在之前提出的问题中找到了一些可能的答案,但是我在让它们正常工作时遇到了问题。我知道这个问题已经被问到,但答案总是有效的代码,对所使用的方法几乎没有解释。

所以:我必须找出客户何时达到 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/

10-11 19:08