通过sqlserver语句,将一行数据展示成两行数据,是否可以实现

假设有一个数据库表:

id             f1          f2

----------- ----------- --------

1            a,b            c

希望能展示成如下的效果:

id             f1          f2

----------- ----------- --------

1            a            c

2            b            c

不知道有没有办法可以实现

FineReport 用户tedvstgbh 发布于 2024-6-18 17:46 (编辑于 2024-6-18 17:46)
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共3回答
最佳回答
0
等待1986Lv2见习互助
发布于2024-6-18 17:48(编辑于 2024-6-18 17:52)

不太好弄,参考下

在SQL Server中,你可以使用STRING_SPLIT函数(在SQL Server 2016及更高版本中可用)来拆分字符串,但它本身不会直接生成新的行。要生成新的行,你通常还需要结合其他方法,如CROSS APPLY或OUTER APPLY,或者使用递归的公用表表达式(CTE)。

但是,由于STRING_SPLIT返回的是一个表格值函数的结果,你可以直接将它与其他表联接,从而“生成”新的行。以下是一个简单的例子,展示了如何使用STRING_SPLIT来拆分一个字段并生成新的行:

假设你有一个名为your_table的表,它有一个包含逗号分隔值的字段f1:

sql复制代码

CREATE TABLE your_table (
id INT,
f1 NVARCHAR(MAX),
f2 NVARCHAR(50)
);
INSERT INTO your_table (id, f1, f2) VALUES (1, 'a,b', 'c');

你可以使用以下查询来拆分f1字段并生成新的行:

sql复制代码

SELECT  
t.id + ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY (SELECT NULL)) - 1 AS new_id,
s.value AS f1_split,
t.f2
FROM  
your_table t
CROSS APPLY
STRING_SPLIT(t.f1, ',') s;

在这个查询中:

  • CROSS APPLY STRING_SPLIT(t.f1, ',') s 会将f1字段中的每个逗号分隔的值拆分为单独的行。

  • ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY (SELECT NULL)) 为每个id分组中的拆分值生成一个行号。由于我们想要新的id从原始的id开始递增,我们使用了t.id + ... - 1来调整行号。

  • t.id + ROW_NUMBER() ... - 1 AS new_id 生成了新的id值。

  • s.value AS f1_split 选择了拆分后的值。

  • t.f2 选择了原始的f2值,因为它对于每个拆分后的值都是相同的。

执行上述查询后,你将得到以下结果:

复制代码

new_id f1_split f2
------ -------- --
1      a        c
2      b        c

最佳回答
0
CovidLv3高级互助
发布于2024-6-18 17:53

参考

if object_id('tb') is not null drop table tb 

go 

create table tb([编号] varchar(3),[产品] varchar(2),[数量] int,[单价] int,[金额] int,[序列号] varchar(8)) 

insert into tb([编号],[产品],[数量],[单价],[金额],[序列号]) 

select '001','AA',3,5,15,'12,13,14' union all

select '002','BB',8,9,13,'22,23,24'

go 

select [编号],[产品],[数量],[单价],[金额] 

,substring([序列号],b.number,charindex(',',[序列号]+',',b.number)-b.number) as [序列号] 

from tb a with(nolock),master..spt_values b with(nolock) 

where b.number>=1 and b.number<len(a.[序列号]) and b.type='P'

and substring(','+[序列号],number,1)=','

go 

drop table tb 

go 

/** 

编号   产品   数量          单价          金额          序列号 

---- ---- ----------- ----------- ----------- -------- 

 AA   3           5           15          12 

 AA   3           5           15          13 

 AA   3           5           15          14 

 BB   8           9           13          22 

 BB   8           9           13          23 

 BB   8           9           13          24 

*/ 

---------- 

最佳回答
0
HHHHH123Lv7中级互助
发布于2024-6-18 17:53

SELECT 

    ROW_NUMBER() OVER (ORDER BY id) AS id,

    value AS f1,

    f2

FROM 

    YourTable

CROSS APPLY 

    STRING_SPLIT(f1, ',');

  • 3关注人数
  • 301浏览人数
  • 最后回答于:2024-6-18 17:53
    请选择关闭问题的原因
    确定 取消
    返回顶部