我有使用分割功能分割的数据。 数据看起来像这样
样本数据:
这里我要选择单词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
我无法继续进行此操作。你能建议这个吗?
答案 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的字段也具有其他字符,则需要进行调整-测试案例