我必須拆分資料列并與員工和經理建立關系。
表ManagerDetails:
| 資料 | 員工 | 經理 |
|---|---|---|
| 小鬼/小鬼2/小鬼3/小鬼4 | 小鬼2 | notimp4 |
| notimp1/notimp2/notimp3/notimp4 | imp3 | 小鬼4 |
如果您觀察下面的輸出表,如果我取第一行,imp4則是 的經理imp3,imp3是 的經理imp2,imp2是 的經理imp,因此我需要按照下面提到的方式構建表。
第一行的預期輸出:
| 資料 | 員工 | 經理 |
|---|---|---|
| 小鬼/小鬼2/小鬼3/小鬼4 | 小鬼4 | |
| 小鬼/小鬼2/小鬼3 | 小鬼4 | imp3 |
| 進出口/進出口2 | imp3 | 小鬼2 |
| 小鬼 | 小鬼2 | 小鬼 |
我使用 CTE 使用LinkManagerDetails的參考拆分行并進行查詢
DECLARE @separator varchar(1) = '/';
WITH rCTE AS(
SELECT
1 as [level] ,
d.data,
CHARINDEX(@separator, CONCAT(d.data, @separator)) AS Position
FROM ManagerDetails d
UNION ALL
SELECT
r.[level] 1,
r.data,
CHARINDEX(@separator, CONCAT(r.data, @separator), r.Position 1) AS Position
FROM rCTE r
WHERE CHARINDEX(@separator, CONCAT(r.data, @separator), r.Position 1) > 0
)
SELECT [level], SUBSTRING(CONCAT(data, @separator), 1, Position - 1) AS [Value]
FROM rCTE
ORDER BY [level], Position DESC
OPTION (MAXRECURSION 0)
通過上述查詢,我??可以按預期顯示資料列,但無法按預期更改經理和員工列。
感謝任何形式的幫助。
uj5u.com熱心網友回復:
如果我正確理解了這個問題,您只需要 aLAG()和遞回 CTE 中分隔符的位置:
桌子:
CREATE TABLE ManagerDetails (id int, data varchar(1000))
INSERT INTO ManagerDetails (id, data)
VALUES
(1, 'imp/imp2/imp3/imp4'),
(2, 'notimp1/notimp2/notimp3/notimp4')
陳述:
DECLARE @separator varchar(1) = '/';
WITH rCTE AS(
SELECT
d.id,
1 as [level] ,
d.data,
CAST(1 AS int) AS index1,
CHARINDEX(@separator, CONCAT(d.data, @separator)) AS index2
FROM ManagerDetails d
UNION ALL
SELECT
r.id,
r.[level] 1,
r.data,
CAST(r.index2 LEN(@separator) AS int),
CHARINDEX(@separator, CONCAT(r.data, @separator), r.index2 1)
FROM rCTE r
WHERE CHARINDEX(@separator, CONCAT(r.data, @separator), r.index2 1) > 0
)
SELECT
id AS Id,
SUBSTRING(CONCAT(data, @separator), 1, index2 - 1) AS [Value],
LAG(SUBSTRING(CONCAT(data, @separator), index1, index2 - index1)) OVER (PARTITION BY id ORDER BY level DESC) AS [Manager],
SUBSTRING(CONCAT(data, @separator), index1, index2 - index1) AS [Employee]
FROM rCTE
ORDER BY id, level DESC
OPTION (MAXRECURSION 0)
結果:
Id Value Manager Employee
---------------------------------------------------
1 imp/imp2/imp3/imp4 imp4
1 imp/imp2/imp3 imp4 imp3
1 imp/imp2 imp3 imp2
1 imp imp2 imp
2 notimp1/notimp2/notimp3/notimp4 notimp4
2 notimp1/notimp2/notimp3 notimp4 notimp3
2 notimp1/notimp2 notimp3 notimp2
2 notimp1 notimp2 notimp1
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/384638.html
標籤:sql-server 查询语句 公用表表达式
下一篇:當變數不為空時如何只運行左連接?
