求一条SQL语句

linjie0000 2017-09-22 04:16:13
原本:
ID 交易金额 余额 类型
1 100 100 存款
2 20 0 扣款
3 30 0 扣款
4 10 0 扣款
5 50 90 存款
效果:

ID 交易金额 余额 类型
1 100 100 存款
2 20 80 扣款
3 30 50 扣款
4 10 40 扣款
5 50 90 存款
...全文
307 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
sum()over(order by xxx) 主要前提 xxx 是个不重复的唯一列
繁花尽流年 2017-09-22
  • 打赏
  • 举报
回复
引用 7 楼 qq_37170555 的回复:
[quote=引用 4 楼 zengertao 的回复:] [quote=引用 2 楼 yenange 的回复:]
IF OBJECT_ID('t') IS NOT NULL
DROP TABLE t
GO
CREATE TABLE t(ID INT,[交易金额] int,[余额] int,[类型] nvarchar(20))
INSERT INTO t  VALUES (1,100,100,'存款')
INSERT INTO t  VALUES (2,20,0,'扣款')
INSERT INTO t  VALUES (3,30,0,'扣款')
INSERT INTO t  VALUES (4,10,0,'扣款')
INSERT INTO t  VALUES (5,50,90,'存款')

SELECT ID
,[交易金额]
,SUM(CASE WHEN [类型]='存款' then 1 else -1 end * [交易金额]) over(order by id)  as [余额]
,[类型]
FROM t
/*
ID	交易金额	余额	    类型
1	100	        100	    存款
2	20	        80	    扣款
3	30		50	    扣款
4	10		40	    扣款
5	50	        90	    存款
*/
思路一样 SELECT id,[交易金额],SUM(IIF([类型]='存款',1,-1) * [交易金额])OVER(ORDER BY id) as [余额],[类型] FROM tablename[/quote] 真心没看懂,你们这样也可以行得通?为啥我的sql server上面运行报错啊[/quote] 都是12的新函数
繁花尽流年 2017-09-22
  • 打赏
  • 举报
回复
引用 2 楼 yenange 的回复:
IF OBJECT_ID('t') IS NOT NULL
DROP TABLE t
GO
CREATE TABLE t(ID INT,[交易金额] int,[余额] int,[类型] nvarchar(20))
INSERT INTO t  VALUES (1,100,100,'存款')
INSERT INTO t  VALUES (2,20,0,'扣款')
INSERT INTO t  VALUES (3,30,0,'扣款')
INSERT INTO t  VALUES (4,10,0,'扣款')
INSERT INTO t  VALUES (5,50,90,'存款')

SELECT ID
,[交易金额]
,SUM(CASE WHEN [类型]='存款' then 1 else -1 end * [交易金额]) over(order by id)  as [余额]
,[类型]
FROM t
/*
ID	交易金额	余额	    类型
1	100	        100	    存款
2	20	        80	    扣款
3	30		50	    扣款
4	10		40	    扣款
5	50	        90	    存款
*/
思路一样 SELECT id,[交易金额],SUM(IIF([类型]='存款',1,-1) * [交易金额])OVER(ORDER BY id) as [余额],[类型] FROM tablename
听雨停了 2017-09-22
  • 打赏
  • 举报
回复
引用 5 楼 yenange 的回复:
[quote=引用 3 楼 qq_37170555 的回复:] [quote=引用 2 楼 yenange 的回复:]
IF OBJECT_ID('t') IS NOT NULL
DROP TABLE t
GO
CREATE TABLE t(ID INT,[交易金额] int,[余额] int,[类型] nvarchar(20))
INSERT INTO t  VALUES (1,100,100,'存款')
INSERT INTO t  VALUES (2,20,0,'扣款')
INSERT INTO t  VALUES (3,30,0,'扣款')
INSERT INTO t  VALUES (4,10,0,'扣款')
INSERT INTO t  VALUES (5,50,90,'存款')

SELECT ID
,[交易金额]
,SUM(CASE WHEN [类型]='存款' then 1 else -1 end * [交易金额]) over(order by id)  as [余额]
,[类型]
FROM t
/*
ID	交易金额	余额	    类型
1	100	        100	    存款
2	20	        80	    扣款
3	30		50	    扣款
4	10		40	    扣款
5	50	        90	    存款
*/
是不是漏了点啥,我咋没看懂这个逻辑呢,而且好像这样运行不通啊[/quote] 要 SQL Server2012 +[/quote] 我说呢,看来我要去装个高版本了
听雨停了 2017-09-22
  • 打赏
  • 举报
回复
引用 4 楼 zengertao 的回复:
[quote=引用 2 楼 yenange 的回复:]
IF OBJECT_ID('t') IS NOT NULL
DROP TABLE t
GO
CREATE TABLE t(ID INT,[交易金额] int,[余额] int,[类型] nvarchar(20))
INSERT INTO t  VALUES (1,100,100,'存款')
INSERT INTO t  VALUES (2,20,0,'扣款')
INSERT INTO t  VALUES (3,30,0,'扣款')
INSERT INTO t  VALUES (4,10,0,'扣款')
INSERT INTO t  VALUES (5,50,90,'存款')

SELECT ID
,[交易金额]
,SUM(CASE WHEN [类型]='存款' then 1 else -1 end * [交易金额]) over(order by id)  as [余额]
,[类型]
FROM t
/*
ID	交易金额	余额	    类型
1	100	        100	    存款
2	20	        80	    扣款
3	30		50	    扣款
4	10		40	    扣款
5	50	        90	    存款
*/
思路一样 SELECT id,[交易金额],SUM(IIF([类型]='存款',1,-1) * [交易金额])OVER(ORDER BY id) as [余额],[类型] FROM tablename[/quote] 真心没看懂,你们这样也可以行得通?为啥我的sql server上面运行报错啊
RINK_1 2017-09-22
  • 打赏
  • 举报
回复

SELECT A.ID,
       A.TRANS_AMOUNT,
       ISNULL(SUB_TOTAL,0)+CASE WHEN TYPE='存款' THEN TRANS_AMOUNT ELSE -1*TRANS_AMOUNT END AS BALANCE_FINAL,
       TYPE
FROM #T A
OUTER APPLY 
(SELECT SUM(CASE WHEN TYPE='存款' THEN TRANS_AMOUNT ELSE -1*TRANS_AMOUNT END) AS SUB_TOTAL FROM #T WHERE ID<A.ID) AS B

吉普赛的歌 2017-09-22
  • 打赏
  • 举报
回复
引用 3 楼 qq_37170555 的回复:
[quote=引用 2 楼 yenange 的回复:]
IF OBJECT_ID('t') IS NOT NULL
DROP TABLE t
GO
CREATE TABLE t(ID INT,[交易金额] int,[余额] int,[类型] nvarchar(20))
INSERT INTO t  VALUES (1,100,100,'存款')
INSERT INTO t  VALUES (2,20,0,'扣款')
INSERT INTO t  VALUES (3,30,0,'扣款')
INSERT INTO t  VALUES (4,10,0,'扣款')
INSERT INTO t  VALUES (5,50,90,'存款')

SELECT ID
,[交易金额]
,SUM(CASE WHEN [类型]='存款' then 1 else -1 end * [交易金额]) over(order by id)  as [余额]
,[类型]
FROM t
/*
ID	交易金额	余额	    类型
1	100	        100	    存款
2	20	        80	    扣款
3	30		50	    扣款
4	10		40	    扣款
5	50	        90	    存款
*/
是不是漏了点啥,我咋没看懂这个逻辑呢,而且好像这样运行不通啊[/quote] 要 SQL Server2012 +
听雨停了 2017-09-22
  • 打赏
  • 举报
回复
引用 2 楼 yenange 的回复:
IF OBJECT_ID('t') IS NOT NULL
DROP TABLE t
GO
CREATE TABLE t(ID INT,[交易金额] int,[余额] int,[类型] nvarchar(20))
INSERT INTO t  VALUES (1,100,100,'存款')
INSERT INTO t  VALUES (2,20,0,'扣款')
INSERT INTO t  VALUES (3,30,0,'扣款')
INSERT INTO t  VALUES (4,10,0,'扣款')
INSERT INTO t  VALUES (5,50,90,'存款')

SELECT ID
,[交易金额]
,SUM(CASE WHEN [类型]='存款' then 1 else -1 end * [交易金额]) over(order by id)  as [余额]
,[类型]
FROM t
/*
ID	交易金额	余额	    类型
1	100	        100	    存款
2	20	        80	    扣款
3	30		50	    扣款
4	10		40	    扣款
5	50	        90	    存款
*/
是不是漏了点啥,我咋没看懂这个逻辑呢,而且好像这样运行不通啊
吉普赛的歌 2017-09-22
  • 打赏
  • 举报
回复
IF OBJECT_ID('t') IS NOT NULL
DROP TABLE t
GO
CREATE TABLE t(ID INT,[交易金额] int,[余额] int,[类型] nvarchar(20))
INSERT INTO t  VALUES (1,100,100,'存款')
INSERT INTO t  VALUES (2,20,0,'扣款')
INSERT INTO t  VALUES (3,30,0,'扣款')
INSERT INTO t  VALUES (4,10,0,'扣款')
INSERT INTO t  VALUES (5,50,90,'存款')

SELECT ID
,[交易金额]
,SUM(CASE WHEN [类型]='存款' then 1 else -1 end * [交易金额]) over(order by id)  as [余额]
,[类型]
FROM t
/*
ID	交易金额	余额	    类型
1	100	        100	    存款
2	20	        80	    扣款
3	30		50	    扣款
4	10		40	    扣款
5	50	        90	    存款
*/
听雨停了 2017-09-22
  • 打赏
  • 举报
回复

IF OBJECT_ID('tempdb..#tab') IS NOT NULL
	DROP TABLE #tab
CREATE TABLE #tab(
	id int,
	交易金额 int,
	余额 int,
	类型 varchar(20)
)
insert into #tab select 1,100,100,'存款'
insert into #tab select 2,20,0,'扣款'
insert into #tab select 3,30,0,'扣款'
insert into #tab select 4,10,0,'扣款'
insert into #tab select 5,50,90,'存款'

;WITH cte AS (
SELECT id,交易金额,余额,类型 FROM #tab where id=1
UNION ALL
SELECT a.id,a.交易金额, case a.类型 when '存款' then b.余额+a.交易金额 else b.余额-a.交易金额 end ,a.类型  from #tab a
INNER JOIN cte b ON a.id=b.id+1
)
SELECT * FROM cte

id          交易金额        余额          类型
----------- ----------- ----------- --------------------
1           100         100         存款
2           20          80          扣款
3           30          50          扣款
4           10          40          扣款
5           50          90          存款

(5 行受影响)

11,849

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 非技术版
社区管理员
  • 非技术版社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧