这种行转列的话怎末实现呀sqlserver

image.png

wlllllll 发布于 2020-11-26 12:33
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共4回答
最佳回答
1
格调Lv6初级互助
发布于2020-11-26 13:25(编辑于 2020-11-26 13:33)
sql server:利用内置函数fn_split 实现拆分为多行,字符串中间的分隔符必须统一
select a.id,cast(b.value as varchar(20)) 
	from aaa a 
	CROSS apply dbo.fn_split (idea,',',0) b
	
如果库里面这个函数,可以新建表值函数fn_split:
CREATE FUNCTION [dbo].[fn_split] ( @String NVARCHAR(MAX) ,  
                                 @Str NVARCHAR(20),
								 @distinct BIT )  
RETURNS @table TABLE ( Value NVARCHAR(MAX),orders int)  
AS   
BEGIN  
    
    DECLARE @i INT ,  
        @j INT ,  
        @l INT ,  
        @v NVARCHAR(MAX),
		@orders int

    SET @i = 0  
    SET @j = 0  
    SET @l = LEN(@String)  
	set @orders=1

    WHILE ( @j < @l )   
        BEGIN  
            SET @j = CHARINDEX(@Str, @String, @i + 1)  
            IF @j = 0   
                SET @j = @l + 1  
            SET @v = SUBSTRING(@String, @i + 1, @j - @i - 1 )  
            
			IF @v <> '' AND (@distinct = 0 OR NOT EXISTS (SELECT 1 FROM @table WHERE Value = @v))
				INSERT  INTO @table  
				VALUES  ( LTRIM(RTRIM(@v)),@orders) 

            SET @i = @j + LEN(@Str) - 1
			set @orders=@orders+1
        END  
    RETURN   
END

image.pngimage.png

最佳回答
0
luojian0323Lv7资深互助
发布于2020-11-26 13:01(编辑于 2020-11-26 13:17)

image.png

with tempHobbys as (select Name,Hobby,charindex(',',Hobby)-1 endindex,0 startindex from Hobbys 
union all select Name,Hobby,charindex(',',Hobby,endindex+2)-1 endindex,endindex+2 startindex from tempHobbys where endindex>-1),with tempHobbys 2 as (select Name,Hobby,(case when endindex<0 then len(Hobby) else Hobby end) endindex,startindex from tempHobbys)select Name,substring(Hobby,startindex,endindex-startindex+1) Hobby from tempHobbys2


最佳回答
0
晓亮Lv7资深互助
发布于2020-11-26 13:27

; with cte(id) as 

(

  select '1,2,3,4,5,6'

)

Select

    id=substring(id, b.number, charindex(',', id+',',b.number)-b.number) 

from 

    cte a join master..spt_values  b 

    ON b.type='p' AND b.number BETWEEN 1 AND LEN(a.id)

where

     substring(','+a.id,b.number,1)=','


  • wlllllll wlllllll(提问者) 我想在帆软的sql里面做可以吗
    2020-11-26 13:36 
  • 晓亮 晓亮 回复 wlllllll(提问者) 可以啊,主要看你连的什么数据库的驱动
    2020-11-26 14:38 
  • 晓亮 晓亮 回复 wlllllll(提问者) 上面的sql就是sql server的写法
    2020-11-26 14:38 
最佳回答
0
指间沙Lv6中级互助
发布于2020-11-26 13:37(编辑于 2020-11-26 13:38)
  • 5关注人数
  • 570浏览人数
  • 最后回答于:2020-11-26 13:38
    请选择关闭问题的原因
    确定 取消
    返回顶部