Reputation: 1893
I have one table PrimaryActivity
in there table some columns
present such as.
PrimaryActivityID
INT
ActivityName
NVARCHAR(250)
SELECT [PrimaryActivityID],[ActivityName] FROM [dbo].[PrimaryActivity] (NOLOCK)
--Current Query result
PrimaryActivityID ActivityName
----------------- -----------------------------
3 administrator
122 administrator_icon
126 administrator_icon_delete
124 administrator_icon_insert
123 administrator_icon_search
125 administrator_icon_update
121 home
131 home_clearcache
130 home_dashboard
2 mainmenu
105 mainmenu_acsession
109 mainmenu_acsession_delete
107 mainmenu_acsession_insert
106 mainmenu_acsession_search
108 mainmenu_acsession_update
1132 mainmenu_callfortopics
Expected result
PrimaryActivityID ParentActivity ActivityName
---------------------------------------------------------------
3 administrator NULL
122 administrator_icon
126 administrator_icon_delete
124 administrator_icon_insert
123 administrator_icon_search
125 administrator_icon_update
121 home NULL
131 home_clearcache
130 home_dashboard
2 mainmenu NULL
105 mainmenu_acsession
105 mainmenu_acsession NULL
109 mainmenu_acsession_delete
107 mainmenu_acsession_insert
106 mainmenu_acsession_search
108 mainmenu_acsession_update
1132 mainmenu_callfortopics
Can some help me to get the exact output?
I'll already prepare some examples but not able to get the exact output below the query.
SELECT [PrimaryActivityID]
,NULL [ParentActivity]
,[ActivityName]
FROM [dbo].[UM_PrimaryActivity] (NOLOCK)
UNION
SELECT [PrimaryActivityID]
,[ActivityName] [ParentActivity]
,[ActivityName]
FROM [dbo].[UM_PrimaryActivity] (NOLOCK)
Upvotes: 0
Views: 42
Reputation: 5103
AS an example :
SELECT PrimaryActivityID, ActivityName,
LEFT(ActivityName, COALESCE(NULLIF(CHARINDEX('_', ActivityName), 0), LEN(ActivityName)+1)-1) AS LEADER,
RIGHT(ActivityName, LEN(ActivityName) - CHARINDEX('_', ActivityName)) AS LAGER
FROM PrimaryActivity
Will do the job and you can use it recursively...
And with a recursive query :
WITH
T AS
(
SELECT PrimaryActivityID, ActivityName, 1 AS STEP,
LEFT(ActivityName, COALESCE(NULLIF(CHARINDEX('_', ActivityName), 0), LEN(ActivityName)+1)-1) AS LEADER,
RIGHT(ActivityName, LEN(ActivityName) - NULLIF(CHARINDEX('_', ActivityName), 0)) AS LAGER
FROM PrimaryActivity
UNION ALL
SELECT PrimaryActivityID, ActivityName, STEP + 1,
LEFT(LAGER, COALESCE(NULLIF(CHARINDEX('_', LAGER), 0), LEN(LAGER)+1)-1) AS LEADER,
RIGHT(LAGER, LEN(LAGER) - NULLIF(CHARINDEX('_', LAGER), 0)) AS LAGER
FROM T
WHERE LAGER IS NOT NULL
)
SELECT PrimaryActivityID, ActivityName, STEP, LEADER AS part, SPACE(STEP - 1) + LEADER AS part_hierarchy
FROM T
ORDER BY ActivityName, STEP
Upvotes: 1
Reputation: 5922
Here is a way to get this done...
with data
as (
select PrimaryActivityId
,case when charindex('_',ActivityName) <> 0 then
substring(ActivityName,1,charindex('_',ActivityName)-1)
else ActivityName
end as ParentActivity
,case when charindex('_',ActivityName) <> 0 then ActivityName end as Activityname
from dbo.PrimaryActivity
)
select PrimaryActivityId
,case when ActivityName is null then ParentActivity end as ParentActivity_mod
,ActivityName as ActivityName_mod
from data
+-------------------+--------------------+---------------------------+
| PrimaryActivityId | ParentActivity_mod | ActivityName_mod |
+-------------------+--------------------+---------------------------+
| 3 | administrator | |
| 122 | | administrator_icon |
| 126 | | administrator_icon_delete |
| 124 | | administrator_icon_insert |
| 123 | | administrator_icon_search |
| 125 | | administrator_icon_update |
| 121 | home | |
| 131 | | home_clearcache |
| 130 | | home_dashboard |
| 2 | mainmenu | |
| 105 | | mainmenu_acsession |
| 109 | | mainmenu_acsession_delete |
| 107 | | mainmenu_acsession_insert |
| 106 | | mainmenu_acsession_search |
| 108 | | mainmenu_acsession_update |
| 1132 | | mainmenu_callfortopics |
+-------------------+--------------------+---------------------------+
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=a5891b9bec680fd9332505bd20b7bfb3
Upvotes: 1