Преобразование некоторых значений строк в столбцы - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь преобразовать некоторые значения строк в столбец, ниже - то, что я пытаюсь достичь.

Моя текущая схема:

+------+----------+
|  ID  |   name   |
+------+----------+
|   01 |  Vsp lan |
| 0121 |  abn     |
| 0122 |  abb     |
| 0123 |  vsp     |
|   02 |  Apn lan |
| 0211 |  add     |
| 0221 |  acd     |
+------+----------+

Это то, что я пытаюсь достичь:

+-----+--------+-------+---------+
| kod |   ID   | name  |   lan   |
+-----+--------+-------+---------+
|  01 |   0121 |   abn | vsp lan |
|  01 |   0122 |   abb | vsp lan |
|  01 |   0123 |   vsp | vsp lan |
|  02 |   0211 |   add | Apn lan |
|  02 |   0221 |   acd | Apn lan |
+-----+--------+-------+---------+

, но он пропускает строки, когда name и lan имеют одинаковые значения, в этом случае он пропускает строку со значением имени vsp.

DECLARE @table TABLE (ID VARCHAR(5),[name] VARCHAR(10));
INSERT INTO @table
VALUES
 ('01','Vsp Ian')
,('0121','abn')
,('0122','abb')
,('0123','vsp')

,('02','Apn Ian')
,('0211','add')
,('0221','acd')
;

SELECT a.id as kod, b.id as ID, B.name as name, a.name as lan
FROM @table a
inner join @table b on CHARINDEX(a.id,b.id) = 1 and CHARINDEX(b.name,a.name) = 0

Ответы [ 5 ]

1 голос
/ 27 мая 2020

это решает мою проблему.

DECLARE @table TABLE (ID VARCHAR(5),[name] VARCHAR(10));
INSERT INTO @table
VALUES
 ('01','Vsp Ian')
,('0121','abn')
,('0122','abb')
,('0123','vsp')
,('02','Apn Ian')
,('0211','add')
,('0221','acd')
,('03','Ubb Ian')
,('0301','afg')
,('0302','ampx');


SELECT
 kod = ct.id
,ot.ID
,ot.[name]
,Ian = ct.[name]
FROM @table ot
CROSS JOIN (SELECT ID,[name] FROM @table WHERE [name] LIKE '%[lan]%') ct
WHERE len(ot.ID) > 2 
AND LEFT(ot.id,2) = ct.id;
1 голос
/ 27 мая 2020

Из вашего примера я предполагаю, что вы хотите сопоставить Van_ian с другими именами, если van_ian kod является началом идентификатора имен. Например, 01 - начало 0121, 0122.

DECLARE @table table(id CHAR(10), name varchar(10))

INSERT INTO @table
values
('01','vsp ian'),
('0121','abn'),
('0122','abb'),
('02','vsp ian'),
('0211','add'),
('0221','acd');

SELECT ct.id as kod,ot.id, ot.name,ct.name as ian FROM @table as ot
CROSS JOIN
(SELECT distinct id, name from @table WHERE name like 'vsp%'
) as ct(id,name)
WHERE ot.name not like 'vsp%'
and LEFT(ot.id,2) = ct.id
+-----+--------+-------+---------+
| kod |   id   | name  |   ian   |
+-----+--------+-------+---------+
|  01 |   0121 |   abn | vsp ian |
|  01 |   0122 |   abb | vsp ian |
|  02 |   0211 |   add | vsp ian |
|  02 |   0221 |   acd | vsp ian |
+-----+--------+-------+---------+
0 голосов
/ 27 мая 2020

Venkataraman R, ваш ответ был очень близок, я немного изменил его, чтобы он соответствовал его выводу.

DECLARE @table TABLE (ID VARCHAR(5),[name] VARCHAR(10));
INSERT INTO @table
VALUES
 ('01','Vsp_Ian')
,('0121','abn')
,('0122','abb')
,('02','Apn_Ian')
,('0211','add')
,('0221','acd')
,('03','Ubb_Ian')
,('0301','afg')
,('0302','ampx');

SELECT
 kod = ct.id
,ot.ID
,ot.[name]
,Ian = ct.[name]
FROM @table ot
CROSS JOIN (SELECT ID,[name] FROM @table WHERE [name] LIKE '%[_]%') ct
WHERE ot.[name] NOT LIKE '%[_]%'
AND LEFT(ot.id,2) = ct.id;
0 голосов
/ 27 мая 2020

Я наблюдаю закономерность в значениях ID. Например, ID 0121, 0122 можно отнести к ID 01. Точно так же идентификаторы 0211, 0221 могут быть отнесены к идентификаторам 02. Исходя из этого предположения, этот запрос должен выполнять:

select 
    tb1.ID as kod, 
    tb2.ID as ID, 
    tb2.name as name, 
    tb1.name as laen 
from tableName tb1 join tableName tb2 
on tb1.ID != tb2.ID and LOCATE(tb1.ID,tb2.ID) = 1
0 голосов
/ 27 мая 2020

Прямой подход, о котором я могу думать, - это самостоятельное соединение, где один идентификатор начинается с другого

SELECT a.id as kod, b.id as ID, B.name as name, a.name as laen
FROM table_name a
inner join table_name b on CHARINDEX(a.name,b.name) = 1 and CHARINDEX(b.name,a.name) = 0

Это должно работать для вашего примера, но если идентификаторы также длиннее, результат может быть странным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...