SQL SERVER中前后相减,累计求和,多行合并,一行拆多行

Data source preparation:

IF OBJECT_ID('TB','u') IS NOT NULL DROP TABLE TB

CREATE TABLE tb(
IDX INT IDENTITY(1,1),
amount int
)

INSERT INTO tb(amount)
VALUEs
(30),(30),(30),(9),(1),(1),(15),(33),(5),(8),(14),(3)

一、前后相减:

SELECT * ,(SELECT a.amount-b.amount from tb b where a.idx=B.idx+1)as cha
from TB a

在这里插入图片描述

二、累计求和:

① 表关联

SELECT *,(SELECT SUM(AMOUNT) FROM TB B WHERE B.IDX<=A.IDX)AS HE
FROM TB A

在这里插入图片描述

② 窗口函数

select *
,sum(amount) over(order by idx asc ) as HE
from tb

三、多行合并:

select stuff((select ','+cast(amount as varchar) from tb order by amount for xml path('')),1,1,'')

在这里插入图片描述
四、一行拆多行:

IF OBJECT_ID('TB','U')IS NOT NULL DROP TABLE TB
CREATE TABLE TB(
HOBBY VARCHAR(30)
)
INSERT INTO TB
VALUES ('登山,羽毛球,游泳,瑜伽,翼装飞行')
declare @x xml 
SET @x=(select HOBBY=cast('<v>'+replace(HOBBY,',','</v><v>')+'</v>' AS xml )
 from TB)
select HOBBY=T.c.value('.','varchar(20)')
from @x.nodes('v') T(c)

多行合并补充案例:
现有一张学生选修课程表’TB’,转换成第二张图片的格式
图1:TB表
在这里插入图片描述
图2:
在这里插入图片描述
Solution:

IF OBJECT_ID('TB','U')IS NOT NULL DROP TABLE TB

CREATE TABLE TB(
NAME VARCHAR(30),
COURSE VARCHAR(30)
)

INSERT INTO TB
VALUES
('张三','Java'),
('李四','拉丁舞'),
('王五','C语言'),
('赵六','Python'),
('张三','R语言'),
('张三','SQL'),
('王五','Tableau')

select name,(select stuff((select ','+course from tb where name=a.name for xml path('') ),1,1,''))as courses
from tb a 
GROUP BY name;
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值