Я предоставлю ответ на основе SQL-сервера, поскольку ваш связанный вопрос задал этот вопрос.Здесь вы вообще не отметили свой вопрос [sql-server] ... Надеюсь, это поможет ...
Это очень веская причина, почему вы никогда не должны помещать более одного контента в один столбец,Сохраните это в отдельных столбцах, и это будет намного проще.
Более того, это немного пахнет ... Такие проблемы лучше решать на уровне презентации.
Тем не менее это можно сделать:
DECLARE @tbl TABLE(Test VARCHAR(100),Energy INT);
INSERT INTO @tbl VALUES
('C018-3L-1',113)
,('C018-3L-2',79)
,('C018-3L-3',89)
,('C018-3L-4',90)
,('C018-3L-5',95)
,('C021-3T-1',115)
,('C021-3T-2',100);
SELECT p.*
FROM
(
SELECT B.Code
,(B.Number-1)/3 AS Line
,CONCAT('Energy-',CASE B.Number % 3 WHEN 0 THEN 3 ELSE B.Number % 3 END) AS ColumnName
,Energy
FROM @tbl t
CROSS APPLY(SELECT LEN(t.Test) - CHARINDEX('-',REVERSE(t.Test))) A(PosLastHyphen)
CROSS APPLY(SELECT LEFT(t.Test,PosLasthyphen) AS Code
,CAST(SUBSTRING(t.Test,PosLastHyphen+2,10) AS INT) AS Number) B
) tbl
PIVOT
(
MAX(Energy) FOR ColumnName IN([Energy-1],[Energy-2],[Energy-3])
) p
ORDER BY Code,Line;
Результат
+---------+------+----------+----------+----------+
| Code | Line | Energy-1 | Energy-2 | Energy-3 |
+---------+------+----------+----------+----------+
| C018-3L | 0 | 113 | 79 | 89 |
+---------+------+----------+----------+----------+
| C018-3L | 1 | 90 | 95 | NULL |
+---------+------+----------+----------+----------+
| C021-3T | 0 | 115 | 100 | NULL |
+---------+------+----------+----------+----------+
Некоторые пояснения
Я использую CROSS APPLY
для вычисления разделениявашего кода и бегущий номер.Затем я использую целочисленное деление для вычисления группы и оператор по модулю %
, чтобы разбить это на три столбца.