将多条记录(行)合并为一条记录(行)
Combining the multiple records(rows) into single record(row)
我正在尝试将多行组合成一行,我能够得到其中的一半我尝试了很多方法得到剩下的一半,下面是我写的sql。任何帮助将不胜感激。
DROP TABLE #TEST_DEPT_NAME
CREATE TABLE #TEST_DEPT_NAME ([ID] [varchar](255) NULL,[CSN_ID] [varchar](50) NULL,[NOTE_ID] [varchar](50) NULL,[DEPARTMENT_NAME] [varchar](255) NULL,
[NOTE_CSN_ID] [varchar](50) NULL,[LINE] [varchar](50) NULL,[NOTE_TEXT] [nvarchar](max) NULL,[AUTHOR_USER_ID] [varchar](50) NULL,[AUTHOR_USER_NAME] [varchar](255) NULL,
[NOTE_TYPE_NAME] [varchar](255) NULL,[IS_ARCHIVED_YN] [varchar](255) NULL,[NOTE_STATUS_NAME] [varchar](255) NULL)
INSERT INTO #TEST_DEPT_NAME
VALUES ('123456','1234567','12345678' ,'TEST','001234' ,1 ,'NOTES_1.1' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','001234' ,1 ,'NOTES_1.1.1' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','0012345' ,2 ,'NOTES_1.2' ,'999999','TEST 1','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','00123456' ,3 ,'NOTES_1.3' ,'999999','TEST 1','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','66666' ,1 ,'NOTES_2.1' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','66666' ,2 ,'NOTES_2.2' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','66666' ,3 ,'NOTES_2.3' ,'1234','TEST','Clinic Note','N','Signed')
SELECT distinct ID,[CSN_ID],[NOTE_ID],[DEPARTMENT_NAME],[NOTE_TYPE_NAME],[IS_ARCHIVED_YN]
,[NOTE_TEXT] = (select ' '+ case when [NOTE_TEXT]= '' then null else [NOTE_TEXT]end from #TEST_DEPT_NAME P1
WHERE P1.[ID] = P2.[ID]AND P1.[CSN_ID] =P2.[CSN_ID] AND P1.NOTE_ID = P2.NOTE_ID AND P1.DEPARTMENT_NAME = P2.DEPARTMENT_NAME
AND P1.LINE = P2.LINE AND P1.NOTE_TYPE_NAME =P2.NOTE_TYPE_NAME AND P1.NOTE_CSN_ID = P2.NOTE_CSN_ID AND P1.IS_ARCHIVED_YN =P2.IS_ARCHIVED_YN FOR XML PATH(''))
FROM #TEST_DEPT_NAME P2 WHERE [ID] = '123456'
GROUP BY ID,CSN_ID,[NOTE_ID],[DEPARTMENT_NAME],[NOTE_TYPE_NAME],[IS_ARCHIVED_YN],LINE,NOTE_CSN_ID
当我 运行 高于 SQL 时,我得到的结果集如下
ID CSN_ID NOTE_ID DEPARTMENT_NAME NOTE_TEXT
123456 1234567 12345678 TEST NOTES_1.1 NOTES_1.1.1
123456 1234567 12345678 TEST NOTES_1.2
123456 1234567 12345678 TEST NOTES_1.3
123456 1234567 12345678 TEST NOTES_2.1
123456 1234567 12345678 TEST NOTES_2.2
123456 1234567 12345678 TEST NOTES_2.3
但是我想要如下图的结果
ID CSN_ID NOTE_ID DEPARTMENT_NAME NOTE_TEXT
123456 1234567 12345678 TEST NOTES_1.1 NOTES_1.1.1 NOTES_1.2 NOTES_1.3
123456 1234567 12345678 TEST NOTES_2.1 NOTES_2.2 NOTES_2.3
我的假设是这是拟音数据,Note_Text 的值实际上是用户输入的长格式注释。 note_csn_id 字段中的值和分组依据中包含的行导致查询分离出单独的 "Note_1" 记录。
您的查询在#test_dept_name中产生以下结果:
ID CSN_ID NOTE_ID DEPARTMENT_NAME NOTE_CSN_ID LINE NOTE_TEXT AUTHOR_USER_ID AUTHOR_USER_NAME NOTE_TYPE_NAME IS_ARCHIVED_YN NOTE_STATUS_NAME
123456 1234567 12345678 TEST 1234 1 NOTES_1.1 1234 TEST Clinic Note N Signed
123456 1234567 12345678 TEST 1234 1 NOTES_1.1.1 1234 TEST Clinic Note N Signed
123456 1234567 12345678 TEST 12345 2 NOTES_1.2 999999 TEST 1 Clinic Note N Signed
123456 1234567 12345678 TEST 123456 3 NOTES_1.3 999999 TEST 1 Clinic Note N Signed
123456 1234567 12345678 TEST 66666 1 NOTES_2.1 1234 TEST Clinic Note N Signed
123456 1234567 12345678 TEST 66666 2 NOTES_2.2 1234 TEST Clinic Note N Signed
123456 1234567 12345678 TEST 66666 3 NOTES_2.3 1234 TEST Clinic Note N Signed
请注意,note_csn_id 会在注释行更改时更改。这可能是多余的行为,因为您有一个单独的行号。我们可以按照您的意愿进行查询:
- 将 group by 子句更改为仅考虑第一个 X
note_csn_id 的字符(通常是个坏主意,因为 id 字段往往
变长)
- 更改 note_csn_id 的填充方式以实现
每组笔记都是独一无二的(如果您可以控制 note_csn_id 的填充方式,那就更好了)
在任何一种情况下,您还需要从子句中删除 Join on Line select 并从 group by 子句中删除行。
如果您能够更改 note_csn_id 的填充方式,使其看起来像这样:
INSERT INTO #TEST_DEPT_NAME
VALUES ('123456','1234567','12345678' ,'TEST','001234' ,1 ,'NOTES_1.1' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','001234' ,1 ,'NOTES_1.1.1' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','001234' ,2 ,'NOTES_1.2' ,'999999','TEST 1','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','001234' ,3 ,'NOTES_1.3' ,'999999','TEST 1','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','66666' ,1 ,'NOTES_2.1' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','66666' ,2 ,'NOTES_2.2' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','66666' ,3 ,'NOTES_2.3' ,'1234','TEST','Clinic Note','N','Signed')
然后你可以把select改成下面的:
SELECT distinct
ID,
[CSN_ID],
[NOTE_ID],
[DEPARTMENT_NAME],
[NOTE_TYPE_NAME],
[IS_ARCHIVED_YN],
[NOTE_TEXT] = (select ' '+ case when [NOTE_TEXT]= '' then null else [NOTE_TEXT]end from #TEST_DEPT_NAME P1
WHERE P1.[ID] = P2.[ID]AND P1.[CSN_ID] =P2.[CSN_ID] AND P1.NOTE_ID = P2.NOTE_ID AND P1.DEPARTMENT_NAME = P2.DEPARTMENT_NAME
AND P1.NOTE_TYPE_NAME =P2.NOTE_TYPE_NAME AND P1.NOTE_CSN_ID = P2.NOTE_CSN_ID AND P1.IS_ARCHIVED_YN =P2.IS_ARCHIVED_YN FOR XML PATH(''))
FROM #TEST_DEPT_NAME P2 WHERE [ID] = '123456'
GROUP BY ID,CSN_ID,[NOTE_ID],[DEPARTMENT_NAME],[NOTE_TYPE_NAME],[IS_ARCHIVED_YN],NOTE_CSN_ID
得到这个结果:
ID CSN_ID NOTE_ID DEPARTMENT_NAME NOTE_TYPE_NAME IS_ARCHIVED_YN NOTE_TEXT
123456 1234567 12345678 TEST Clinic Note N NOTES_1.1 NOTES_1.1.1 NOTES_1.2 NOTES_1.3
123456 1234567 12345678 TEST Clinic Note N NOTES_2.1 NOTES_2.2 NOTES_2.3
您可以使用 left
和 stuff
函数以及 group by
:
select t.ID ,t.CSN_ID,t.NOTE_ID,t.DEPARTMENT_NAME,
STUFF((
select ' ' + t1.NOTE_TEXT
from #TEST_DEPT_NAME t1
where t.ID =t1.ID and t.CSN_ID=t1.CSN_ID and t.NOTE_ID=t1.NOTE_ID
and t.DEPARTMENT_NAME=t1.DEPARTMENT_NAME
and left(t.NOTE_TEXT,8)=left(t1.NOTE_TEXT,8)
for xml path(''), type
).value('.', 'varchar(max)'), 1, 1, '') NOTE_TEXT_
from #TEST_DEPT_NAME t
group by t.ID ,t.CSN_ID,t.NOTE_ID,t.DEPARTMENT_NAME,left(t.NOTE_TEXT,8)
输出:
ID CSN_ID NOTE_ID DEPARTMENT_NAME NOTE_TEXT_
123456 1234567 12345678 TEST NOTES_1.1 NOTES_1.1.1 NOTES_1.2 NOTES_1.3
123456 1234567 12345678 TEST NOTES_2.1 NOTES_2.2 NOTES_2.3
编辑: 如果你有超过 9 个 NOTE_TEXT
我的意思是 NOTES_1..,NOTES_2...,NOTES_10...,NOTES_100...
那么你必须使用 charindex('.',t.NOTE_TEXT)
而不是 8
在上面的查询中:
select t.ID ,t.CSN_ID,t.NOTE_ID,t.DEPARTMENT_NAME,
STUFF((
select ' ' + t1.NOTE_TEXT
from #TEST_DEPT_NAME t1
where t.ID =t1.ID and t.CSN_ID=t1.CSN_ID and t.NOTE_ID=t1.NOTE_ID
and t.DEPARTMENT_NAME=t1.DEPARTMENT_NAME
and left(t.NOTE_TEXT,charindex('.',t.NOTE_TEXT))
=left(t1.NOTE_TEXT,charindex('.',t1.NOTE_TEXT))
for xml path(''), type
).value('.', 'varchar(max)'), 1, 1, '') NOTE_TEXT_
from #TEST_DEPT_NAME t
group by t.ID ,t.CSN_ID,t.NOTE_ID,t.DEPARTMENT_NAME,
left(t.NOTE_TEXT,charindex('.',t.NOTE_TEXT))
我认为这个查询是所需的:
SELECT distinct ID,[CSN_ID],[NOTE_ID],[DEPARTMENT_NAME],[NOTE_TEXT] =
(
select ' '+ case when [NOTE_TEXT]= '' then null else [NOTE_TEXT]end
from #TEST_DEPT_NAME P1
WHERE P1.[ID] = P2.[ID]
AND P1.[CSN_ID] =P2.[CSN_ID]
AND P1.NOTE_ID = P2.NOTE_ID
AND P1.DEPARTMENT_NAME = P2.DEPARTMENT_NAME
AND P1.NOTE_TYPE_NAME =P2.NOTE_TYPE_NAME
AND P1.IS_ARCHIVED_YN =P2.IS_ARCHIVED_YN
AND SUBSTRING(P1.NOTE_TEXT, 0, CHARINDEX('.', P1.NOTE_TEXT)) = SUBSTRING(P2.NOTE_TEXT, 0, CHARINDEX('.', P2.NOTE_TEXT))
FOR XML PATH('')
)
FROM #TEST_DEPT_NAME P2 WHERE [ID] = '123456'
GROUP BY ID,CSN_ID,[NOTE_ID],[DEPARTMENT_NAME],[NOTE_TYPE_NAME],[IS_ARCHIVED_YN],LINE,NOTE_CSN_ID,SUBSTRING([NOTE_TEXT], 0, CHARINDEX('.', [NOTE_TEXT]))
结果:
ID CSN_ID NOTE_ID DEPARTMENT_NAME NOTE_TEXT
123456 1234567 12345678 TEST NOTES_1.1 NOTES_1.1.1 NOTES_1.2 NOTES_1.3
123456 1234567 12345678 TEST NOTES_2.1 NOTES_2.2 NOTES_2.3
我正在尝试将多行组合成一行,我能够得到其中的一半我尝试了很多方法得到剩下的一半,下面是我写的sql。任何帮助将不胜感激。
DROP TABLE #TEST_DEPT_NAME
CREATE TABLE #TEST_DEPT_NAME ([ID] [varchar](255) NULL,[CSN_ID] [varchar](50) NULL,[NOTE_ID] [varchar](50) NULL,[DEPARTMENT_NAME] [varchar](255) NULL,
[NOTE_CSN_ID] [varchar](50) NULL,[LINE] [varchar](50) NULL,[NOTE_TEXT] [nvarchar](max) NULL,[AUTHOR_USER_ID] [varchar](50) NULL,[AUTHOR_USER_NAME] [varchar](255) NULL,
[NOTE_TYPE_NAME] [varchar](255) NULL,[IS_ARCHIVED_YN] [varchar](255) NULL,[NOTE_STATUS_NAME] [varchar](255) NULL)
INSERT INTO #TEST_DEPT_NAME
VALUES ('123456','1234567','12345678' ,'TEST','001234' ,1 ,'NOTES_1.1' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','001234' ,1 ,'NOTES_1.1.1' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','0012345' ,2 ,'NOTES_1.2' ,'999999','TEST 1','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','00123456' ,3 ,'NOTES_1.3' ,'999999','TEST 1','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','66666' ,1 ,'NOTES_2.1' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','66666' ,2 ,'NOTES_2.2' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','66666' ,3 ,'NOTES_2.3' ,'1234','TEST','Clinic Note','N','Signed')
SELECT distinct ID,[CSN_ID],[NOTE_ID],[DEPARTMENT_NAME],[NOTE_TYPE_NAME],[IS_ARCHIVED_YN]
,[NOTE_TEXT] = (select ' '+ case when [NOTE_TEXT]= '' then null else [NOTE_TEXT]end from #TEST_DEPT_NAME P1
WHERE P1.[ID] = P2.[ID]AND P1.[CSN_ID] =P2.[CSN_ID] AND P1.NOTE_ID = P2.NOTE_ID AND P1.DEPARTMENT_NAME = P2.DEPARTMENT_NAME
AND P1.LINE = P2.LINE AND P1.NOTE_TYPE_NAME =P2.NOTE_TYPE_NAME AND P1.NOTE_CSN_ID = P2.NOTE_CSN_ID AND P1.IS_ARCHIVED_YN =P2.IS_ARCHIVED_YN FOR XML PATH(''))
FROM #TEST_DEPT_NAME P2 WHERE [ID] = '123456'
GROUP BY ID,CSN_ID,[NOTE_ID],[DEPARTMENT_NAME],[NOTE_TYPE_NAME],[IS_ARCHIVED_YN],LINE,NOTE_CSN_ID
当我 运行 高于 SQL 时,我得到的结果集如下
ID CSN_ID NOTE_ID DEPARTMENT_NAME NOTE_TEXT
123456 1234567 12345678 TEST NOTES_1.1 NOTES_1.1.1
123456 1234567 12345678 TEST NOTES_1.2
123456 1234567 12345678 TEST NOTES_1.3
123456 1234567 12345678 TEST NOTES_2.1
123456 1234567 12345678 TEST NOTES_2.2
123456 1234567 12345678 TEST NOTES_2.3
但是我想要如下图的结果
ID CSN_ID NOTE_ID DEPARTMENT_NAME NOTE_TEXT
123456 1234567 12345678 TEST NOTES_1.1 NOTES_1.1.1 NOTES_1.2 NOTES_1.3
123456 1234567 12345678 TEST NOTES_2.1 NOTES_2.2 NOTES_2.3
我的假设是这是拟音数据,Note_Text 的值实际上是用户输入的长格式注释。 note_csn_id 字段中的值和分组依据中包含的行导致查询分离出单独的 "Note_1" 记录。
您的查询在#test_dept_name中产生以下结果:
ID CSN_ID NOTE_ID DEPARTMENT_NAME NOTE_CSN_ID LINE NOTE_TEXT AUTHOR_USER_ID AUTHOR_USER_NAME NOTE_TYPE_NAME IS_ARCHIVED_YN NOTE_STATUS_NAME
123456 1234567 12345678 TEST 1234 1 NOTES_1.1 1234 TEST Clinic Note N Signed
123456 1234567 12345678 TEST 1234 1 NOTES_1.1.1 1234 TEST Clinic Note N Signed
123456 1234567 12345678 TEST 12345 2 NOTES_1.2 999999 TEST 1 Clinic Note N Signed
123456 1234567 12345678 TEST 123456 3 NOTES_1.3 999999 TEST 1 Clinic Note N Signed
123456 1234567 12345678 TEST 66666 1 NOTES_2.1 1234 TEST Clinic Note N Signed
123456 1234567 12345678 TEST 66666 2 NOTES_2.2 1234 TEST Clinic Note N Signed
123456 1234567 12345678 TEST 66666 3 NOTES_2.3 1234 TEST Clinic Note N Signed
请注意,note_csn_id 会在注释行更改时更改。这可能是多余的行为,因为您有一个单独的行号。我们可以按照您的意愿进行查询:
- 将 group by 子句更改为仅考虑第一个 X note_csn_id 的字符(通常是个坏主意,因为 id 字段往往 变长)
- 更改 note_csn_id 的填充方式以实现 每组笔记都是独一无二的(如果您可以控制 note_csn_id 的填充方式,那就更好了)
在任何一种情况下,您还需要从子句中删除 Join on Line select 并从 group by 子句中删除行。
如果您能够更改 note_csn_id 的填充方式,使其看起来像这样:
INSERT INTO #TEST_DEPT_NAME
VALUES ('123456','1234567','12345678' ,'TEST','001234' ,1 ,'NOTES_1.1' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','001234' ,1 ,'NOTES_1.1.1' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','001234' ,2 ,'NOTES_1.2' ,'999999','TEST 1','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','001234' ,3 ,'NOTES_1.3' ,'999999','TEST 1','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','66666' ,1 ,'NOTES_2.1' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','66666' ,2 ,'NOTES_2.2' ,'1234','TEST','Clinic Note','N','Signed')
,('123456','1234567','12345678' ,'TEST','66666' ,3 ,'NOTES_2.3' ,'1234','TEST','Clinic Note','N','Signed')
然后你可以把select改成下面的:
SELECT distinct
ID,
[CSN_ID],
[NOTE_ID],
[DEPARTMENT_NAME],
[NOTE_TYPE_NAME],
[IS_ARCHIVED_YN],
[NOTE_TEXT] = (select ' '+ case when [NOTE_TEXT]= '' then null else [NOTE_TEXT]end from #TEST_DEPT_NAME P1
WHERE P1.[ID] = P2.[ID]AND P1.[CSN_ID] =P2.[CSN_ID] AND P1.NOTE_ID = P2.NOTE_ID AND P1.DEPARTMENT_NAME = P2.DEPARTMENT_NAME
AND P1.NOTE_TYPE_NAME =P2.NOTE_TYPE_NAME AND P1.NOTE_CSN_ID = P2.NOTE_CSN_ID AND P1.IS_ARCHIVED_YN =P2.IS_ARCHIVED_YN FOR XML PATH(''))
FROM #TEST_DEPT_NAME P2 WHERE [ID] = '123456'
GROUP BY ID,CSN_ID,[NOTE_ID],[DEPARTMENT_NAME],[NOTE_TYPE_NAME],[IS_ARCHIVED_YN],NOTE_CSN_ID
得到这个结果:
ID CSN_ID NOTE_ID DEPARTMENT_NAME NOTE_TYPE_NAME IS_ARCHIVED_YN NOTE_TEXT
123456 1234567 12345678 TEST Clinic Note N NOTES_1.1 NOTES_1.1.1 NOTES_1.2 NOTES_1.3
123456 1234567 12345678 TEST Clinic Note N NOTES_2.1 NOTES_2.2 NOTES_2.3
您可以使用 left
和 stuff
函数以及 group by
:
select t.ID ,t.CSN_ID,t.NOTE_ID,t.DEPARTMENT_NAME,
STUFF((
select ' ' + t1.NOTE_TEXT
from #TEST_DEPT_NAME t1
where t.ID =t1.ID and t.CSN_ID=t1.CSN_ID and t.NOTE_ID=t1.NOTE_ID
and t.DEPARTMENT_NAME=t1.DEPARTMENT_NAME
and left(t.NOTE_TEXT,8)=left(t1.NOTE_TEXT,8)
for xml path(''), type
).value('.', 'varchar(max)'), 1, 1, '') NOTE_TEXT_
from #TEST_DEPT_NAME t
group by t.ID ,t.CSN_ID,t.NOTE_ID,t.DEPARTMENT_NAME,left(t.NOTE_TEXT,8)
输出:
ID CSN_ID NOTE_ID DEPARTMENT_NAME NOTE_TEXT_
123456 1234567 12345678 TEST NOTES_1.1 NOTES_1.1.1 NOTES_1.2 NOTES_1.3
123456 1234567 12345678 TEST NOTES_2.1 NOTES_2.2 NOTES_2.3
编辑: 如果你有超过 9 个 NOTE_TEXT
我的意思是 NOTES_1..,NOTES_2...,NOTES_10...,NOTES_100...
那么你必须使用 charindex('.',t.NOTE_TEXT)
而不是 8
在上面的查询中:
select t.ID ,t.CSN_ID,t.NOTE_ID,t.DEPARTMENT_NAME,
STUFF((
select ' ' + t1.NOTE_TEXT
from #TEST_DEPT_NAME t1
where t.ID =t1.ID and t.CSN_ID=t1.CSN_ID and t.NOTE_ID=t1.NOTE_ID
and t.DEPARTMENT_NAME=t1.DEPARTMENT_NAME
and left(t.NOTE_TEXT,charindex('.',t.NOTE_TEXT))
=left(t1.NOTE_TEXT,charindex('.',t1.NOTE_TEXT))
for xml path(''), type
).value('.', 'varchar(max)'), 1, 1, '') NOTE_TEXT_
from #TEST_DEPT_NAME t
group by t.ID ,t.CSN_ID,t.NOTE_ID,t.DEPARTMENT_NAME,
left(t.NOTE_TEXT,charindex('.',t.NOTE_TEXT))
我认为这个查询是所需的:
SELECT distinct ID,[CSN_ID],[NOTE_ID],[DEPARTMENT_NAME],[NOTE_TEXT] =
(
select ' '+ case when [NOTE_TEXT]= '' then null else [NOTE_TEXT]end
from #TEST_DEPT_NAME P1
WHERE P1.[ID] = P2.[ID]
AND P1.[CSN_ID] =P2.[CSN_ID]
AND P1.NOTE_ID = P2.NOTE_ID
AND P1.DEPARTMENT_NAME = P2.DEPARTMENT_NAME
AND P1.NOTE_TYPE_NAME =P2.NOTE_TYPE_NAME
AND P1.IS_ARCHIVED_YN =P2.IS_ARCHIVED_YN
AND SUBSTRING(P1.NOTE_TEXT, 0, CHARINDEX('.', P1.NOTE_TEXT)) = SUBSTRING(P2.NOTE_TEXT, 0, CHARINDEX('.', P2.NOTE_TEXT))
FOR XML PATH('')
)
FROM #TEST_DEPT_NAME P2 WHERE [ID] = '123456'
GROUP BY ID,CSN_ID,[NOTE_ID],[DEPARTMENT_NAME],[NOTE_TYPE_NAME],[IS_ARCHIVED_YN],LINE,NOTE_CSN_ID,SUBSTRING([NOTE_TEXT], 0, CHARINDEX('.', [NOTE_TEXT]))
结果:
ID CSN_ID NOTE_ID DEPARTMENT_NAME NOTE_TEXT
123456 1234567 12345678 TEST NOTES_1.1 NOTES_1.1.1 NOTES_1.2 NOTES_1.3
123456 1234567 12345678 TEST NOTES_2.1 NOTES_2.2 NOTES_2.3