如何在行中选择特定单词

时间:2018-11-15 16:57:39

标签: sql sql-server tsql

我有使用分割功能分割的数据。 数据看起来像这样

样本数据:

enter image description here

这里我要选择单词3行(Emp_name,as,EmployeeName)和(Dept_name,As,DepartmentName),并将其作为单行。

ID Str_Name

1  Emp_Name As EmployeeName

2  Dept_name As DepartmentName

3  Emp_Id As Employee Status

我无法继续进行此操作。你能建议这个吗?

3 个答案:

答案 0 :(得分:3)

由于ID是连续的,因此您只需要查找具有值AS的行以及(ID-1)之前和(ID + 1)之后的行,然后合并结果。 Example

select b.Id, a.Name + ' ' + b.Name + ' ' + c.Name StrName 
from SampleData b
inner join SampleData a on a.Id = b.id - 1
inner join SampleData c on c.Id = b.id + 1
where b.Name = 'AS'

答案 1 :(得分:0)

Select STRING_AGG(Name,'') from Table where Id%2=0 and Id<11) ; 通常,我们可以通过使用一些agg函数(例如SUM等)来完成,因为它是多行到一行的聚合,但是通过这些,我似乎无法通过group_concat

尝试过

答案 2 :(得分:0)

我认为您正在寻找的是如何将一个字段定义与另一个字段分隔,这就是逗号。因此,将组号分配给从最小ID到最大ID的所有STRING,并仅在找到逗号时才递增组号,这将给出应将哪些STRING连接在一起。
示例实现涉及窗口函数SUM(OVER子句使其成为窗口函数),以及用于串联的FOR XML PATH(''):

DECLARE @test TABLE (
    ID INT
    ,STRING VARCHAR(100)
)

INSERT @test
VALUES
    (1, 'SELECT')
    ,(2, 'Emp_id')
    ,(3, ',')
    ,(4, 'Emp_Name')
    ,(5, 'AS')
    ,(6, 'EmployeeName')
    ,(7, ',')
    ,(8, 'Dept_Name')
    ,(9, 'AS')
    ,(10, 'DepartmentName')
    ,(11, ',')
    ,(12, 'CASE')
    ,(13, 'WHEN')
    ,(14, 'Emp_Status = ''Y''')
    ,(15, 'THEN')
    ,(16, '1')
    ,(17, 'ELSE')
    ,(18, '0')
    ,(19, 'END')
    ,(20, 'AS')
    ,(21, 'EmployeeStatus')

-- Only to show progress:
SELECT * FROM @test ORDER BY ID



SELECT *, SUM (CASE WHEN STRING = ',' THEN 1 ELSE 0 END) OVER (ORDER BY ID) as GroupID
INTO #test
FROM @test

-- Only to show progress:
SELECT * FROM #test ORDER BY ID



SELECT
    GroupID
    ,(SELECT GroupElements.STRING + ' '
      FROM #test as GroupElements
      WHERE GroupElements.GroupID = Groups.GroupID and GroupElements.STRING != 'SELECT'
      FOR XML PATH('')) as STRING
FROM (SELECT distinct GroupID FROM #test) as Groups
ORDER BY GroupID

如果您不希望组编号从零开始,不希望逗号本身出现在结果中,需要单词SELECT,或者包含逗号或SELECT的字段也具有其他字符,则需要进行调整-测试案例