[英]Calculate in join in sql
我正在尝试在 sql 2008 的连接中实现交错计算。我可以为 1 个作业 ID 设置 n 行。 我在下面创建了一个示例
CREATE TABLE Job
(
JobID INT NOT NULL,
Amount INT NOT NULL
);
INSERT INTO Job (JobID, Amount)
VALUES (1, 25),
(1, 45),
(1, 40),
(2, 25),
(3, 26),
(3, 26);
现在JobID = 1
的折扣是 80 ,所以我期望的查询结果输出如下:
如果Amount > Discount
,则显示finalvalue = Amount - Discount
但如果Amount < Discount
,则显示Finalvalue = Amount - Amount
,如果Discount
仍然存在,则从后续行中扣除相同的值。
Job ID Amount FinalValue
1 25 0
1 45 0
1 40 30
所有这些都可以在一个连接中完成吗?
给你:
编辑:注意:您应该添加一列进行排序。 我的方法是按 JobID 进行分区和排序,这使得输出随机......
编辑:对不起,没有添加表格...
CREATE TABLE Job
(
JobID INT NOT NULL,
Amount INT NOT NULL
);
INSERT INTO Job (JobID, Amount)
VALUES (1, 25), (1, 45), (1, 40), (2, 25), (3, 26), (3, 26);
CREATE TABLE Discount
(
JobID INT NOT NULL,
Discount INT NOT NULL
);
INSERT INTO Discount(JobID,Discount)VALUES(1,80),(2,0),(3,10);
WITH myCTE AS
(
SELECT ROW_NUMBER() OVER(PARTITION BY Job.JobID ORDER BY Job.JobID) AS inx
,Job.JobID
,Job.Amount
,Discount.Discount
FROM Job
INNER JOIN Discount ON Job.JobID=Discount.JobID
)
SELECT * FROM myCTE
CROSS APPLY
(
SELECT SUM(x.Amount)
FROM myCTE AS x
WHERE x.JobID=myCTE.JobID
AND x.inx<=myCTE.inx
) AS AmountCummulativ(AmountCummulativ)
CROSS APPLY(SELECT AmountCummulativ-myCTE.Discount) AS DiscountCalculated(DiscountCalculated)
CROSS APPLY(SELECT CASE WHEN DiscountCalculated<0 THEN 0 ELSE DiscountCalculated END) AS DiscountResolved(DiscountResolved)
希望这可以帮助
我认为您正在寻找可以使用案例陈述来完成
select a.jobid,a.Amount,case when a.amount > b.discount then a.amount - b.discount else 0 end final_value
从 Job a 内部加入 Job_discount b on a.jobid = b.jobid
您可以在这里查看结果http://sqlfiddle.com/#!3/f9a46/1
我不得不假设折扣表结构
我为 Job 表(称为 JobOrder)添加了一些序列(行号),以增加总和。 您可以像现在一样更改 JobId、Amount 的顺序!
With JobOrder as (
-- Job order by id and amount
select row_number() over (order by JobID, Amount asc) as rowno, JobId, Amount from Job
),
JobSumIncr as (
select
JobID,
Amount,
(select sum(Amount)
from JobOrder j2
where j2.JobID = j.JobID and j2.RowNo <= j.RowNo
) as AmountTotal
from JobOrder j
)
select
j.JobID,
j.Amount,
j.AmountTotal,
d.Discount,
(case when d.Discount>=j.AmountTotal then 0 else j.AmountTotal-d.Discount end) as FinalValue
from
JobSumIncr j left join Discount d on j.JobID = d.JobID;
假设您的折扣表类似于:
CREATE TABLE Discount (
JobID INT,
Discount INT
);
SqlFiddle 在这里! 对于更安全的 Sql(检查空值并查看剩余折扣),请参阅此SQLFiddle 。
跟踪剩余折扣的版本,请参见上面的 sqlfiddle-2。
您可以尝试以下代码:80 是折扣金额
Select JobID, Amount,
case when SUM (Amount) OVER (partition by JobID ORDER BY JobID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) > 80 then SUM(Amount) OVER (partition by JobID ORDER BY JobID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - 80 else 0 end as FinalValue
from Job
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.