sql运行完全修改
我有一个带有列的表:ID,输入'IN'和'Out'字符串,以及值持有货币数据 我需要按照逻辑,通过求和和和减去值来获得每行的平衡: 如果类型='In',则求和值 如果Type='Out',则为负值 我尝试过一些东西,但我无法确定在哪里有进或出:sql运行完全修改,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个带有列的表:ID,输入'IN'和'Out'字符串,以及值持有货币数据 我需要按照逻辑,通过求和和和减去值来获得每行的平衡: 如果类型='In',则求和值 如果Type='Out',则为负值 我尝试过一些东西,但我无法确定在哪里有进或出: ID Type Value and in balance like this Balance 21 In 55 55 22 IN 78
ID Type Value and in balance like this Balance
21 In 55 55
22 IN 78 133
23 Out 15 118
24 Out 56 62
25 In 72 134
26 Out 5 129
我有这样的代码:
SELECT ID ,
Value ,
( SELECT SUM(y.Value)
FROM dbo.Reestr y
WHERE y.ID <= x.ID
) AS RunningTotal
FROM dbo.Reestr x
ORDER BY 1 ,2 ,3;
只需使用累积和函数。这在SQL Server 2012+中可用:
select r.id, r.value,
sum(case when r.type = 'in' then value
when r.type = 'out' then - value
end) over (order by r.id) as balance
from dbo.Reestr r
ORDER BY 1, 2, 3;
通过在子查询中包含大小写表达式,可以对相关子查询执行相同的操作。只需使用累积和函数即可。这在SQL Server 2012+中可用:
select r.id, r.value,
sum(case when r.type = 'in' then value
when r.type = 'out' then - value
end) over (order by r.id) as balance
from dbo.Reestr r
ORDER BY 1, 2, 3;
通过在子查询中包含大小写表达式,可以对相关子查询执行相同的操作。试试这个
SELECT ID ,
Value ,
(select sum(case when Type = 'IN' then Value
when Type='OUT' then (0-value) end)
FROM dbo.Reestr y where x.Id>=y.id) AS RunningTotal
FROM dbo.Reestr x
ORDER BY 1 ,2 ,3;
试试这个
SELECT ID ,
Value ,
(select sum(case when Type = 'IN' then Value
when Type='OUT' then (0-value) end)
FROM dbo.Reestr y where x.Id>=y.id) AS RunningTotal
FROM dbo.Reestr x
ORDER BY 1 ,2 ,3;
@拉维。问题中的代码没有分组依据。数据也没有表明需要这样做。如果您对聚合的累积和有疑问,请提问。@Gordon Linoff…您使用的是聚合函数,您必须使用group by子句,因为聚合函数中没有Id。若问题不存在,那个么这就是为什么他并没有得到想要的结果,@Ravi。这是一个窗口函数。我认为你需要更好地学习SQL。@Ravi。问题中的代码没有分组依据。数据也没有表明需要这样做。如果您对聚合的累积和有疑问,请提问。@Gordon Linoff…您使用的是聚合函数,您必须使用group by子句,因为聚合函数中没有Id。若问题不存在,那个么这就是为什么他并没有得到想要的结果,@Ravi。这是一个窗口函数。我认为您需要更好地学习SQL。