разделить столбец на новую строку для трех столбцов - PullRequest
0 голосов
/ 05 ноября 2018

Я пытался использовать; с tmp () и union все, но все еще не повезло через mssql.

Это мой источник

instance  |host   |servicename
DB,tomcat |abc,xyz|sap,java
null      |efg,ijn|D40,L90

И я бы хотел получить такой вывод

instance|host|servicename
DB      |abc |sap
Tomcat  |xyz |java
        |efg |D40
        |ijn |L90

У вас есть какое-нибудь решение, как сделать для этого отношение?

1 Ответ

0 голосов
/ 05 ноября 2018

Попробуйте это

IF OBJECT_ID('tempdb..#Temp')IS NOT NULL
DROP TABLE #Temp
;WITH CTE(instance  ,host   ,servicename)
AS
(
SELECT 'DB,tomcat' ,'abc,xyz','sap,java' UNION ALL
SELECT null      ,'efg,ijn','D40,L90'
)

SELECT ROW_NUMBER()OVER(ORDER BY instance) AS Seq
        ,ISNULL(instance,'NA') AS instance
        ,Host
        ,servicename
 INTO #Temp FROM CTE

SELECT a.Seq
        ,Split.a.value('.','nvarchar(1000)') AS instance
        ,Split1.a.value('.','nvarchar(1000)') AS host
        ,Split2.a.value('.','nvarchar(1000)') AS servicename
FROM(
SELECT Seq
    ,CAST('<S>'+REPLACE(instance,',','</S><S>')+'</S>'  AS XML )AS instance
    ,CAST('<S>'+REPLACE(host,',','</S><S>')+'</S>'  AS XML )AS host
    ,CAST('<S>'+REPLACE(servicename,',','</S><S>')+'</S>'  AS XML )AS servicename
    FROM #Temp 
) As a
CROSS APPLY instance.nodes('S') AS Split(a)
CROSS APPLY host.nodes('S') AS Split1(a)
CROSS APPLY servicename.nodes('S') AS Split2(a)
ORDER BY seq
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...