gpt4 book ai didi

sql - 查明总和值何时达到 SQL 中的某个检查点

转载 作者:行者123 更新时间:2023-12-04 23:45:34 25 4
gpt4 key购买 nike

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

因此:我必须查明客户何时达到 VIP 状态,即他的订单值(value)超过 50 000 时。我有 2 个表:一个包含 orderid、customerid 和 orderdate,第二个包含 orderid 、数量和单价。我正在写的查询结果应该是 3 列宽,一列是客户 ID,一列是真/假,名为“是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com