繁体   English   中英

在sql中加入计算

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM