Pomoc w zapytaniu dzielenie komórki

0

Witam proszę o pomoc lub wskazówkę przy tworzeniu zapytaniu MS SQL:
Mam tabelę klinecie

ID Nazwa_klienta
1 Firma Handlowa usługowa "Programista" Jan Kowalski, Maria Kowlaska

Chciałbym przenieść tą tabelę do nowej która ma strukturę:

Klienci ID Nazwa Imię 1 Imię 2
1 Firma Handlowa usługowa "Programista" Jan Kowalski ,Maria Kowalska

Kolumny Nazwa i Imię 1 i Imię 2 są ograniczone do 25 znaków. Chciałbym przenieść dane z jednej tabeli do drugiej podzielić Nazwę klienta na 25 znaków bez dzielenia wyrazów.

Wymyśliłem coś takiego
SELECT ID, left(Nazwa_klienta,25 - charindex(' ',reverse(left(Nazwa_klienta)))) AS [Nazwa]
From Klienci
To zapytanie wyodrębni 25 znaków bez dzielenia wyrażenia
Natomiast problem pojawia się z pozostałymi kolumnami jak je wyodrębnić?

Z góry dziękuje za pomoc

0

To zależy od reszty danych uniwersalnego rozwiązania nie ma.

0

możesz rozwinąć swoją wypowiedź???
Wszystkie dane są w formie tekstowej

0

Nie wiem jak ty to policzyłeś ale z Twojego przypadku wynika, że Imie1 będzie mieć 26 znaków próbowałem zrobić uniwersalny mechanizm dzielący na 25 znaków bez rozdzielania wyrazów ale wtedy w Imie1 wpisze ci się tylko "Programista" Jan

0

Między nazwą a imieniem nie masz żadnego separatora, więc jak chcesz to podzielić?
Jeżeli danych nie jest dużo to zrób to ręcznie.

0

W nowej tabeli kolumna Imię1 ma zawierać imię i nazwisko ?(to samo sie tyczy Imię2)
Jeśli nazwa firm kończy się " to zobacz ten przykład:

 
  declare @imie int 
    declare @nazwisko int 
	select @imie= patindex('%" %',nazwa) from Table_1  
	select @nazwisko = patindex('%,%',nazwa) from Table_1 
	select left(nazwa,@imie) from Table_1 
	select SUBSTRING(nazwa,@imie+1,@nazwisko-@imie-1) from table_1
	select substring(nazwa,@nazwisko+1,len(nazwa)) from Table_1 
0

Dziękuje za pomoc. Próbuje dalej na podstawie tego co od Was otrzymałem zobaczymy może się coś uda wykombinować :)

0

Należy się zastanowić nad kilkoma rzeczami.

Czy zawsze są podane dwie osoby?
Czy jeśli są to zawsze rozdzielone przecinkami?

To zadanie jest możliwe do wykonania, potrzebna jest tylko analiza danych jakie znajdują się w bazie.

Tutaj masz naiwny parser, który dzieli ciąg na trzy kolumny. Można go wzbogacić o dodatkowe warunki przy wyodrębnianiu tekstu. Wymaga też optymalizacji, m.in. pod kątem długości ciągu, aby uniknąć pustych przebiegów oraz założenia odpowiednich indeksów.

--create table ciagi_znakow (ID INT IDENTITY(1,1),ciag NVARCHAR(MAX))
--insert INTO ciagi_znakow (ciag) values ('Firma Handlowa usługowa "Programista" Jan Kowalski, Maria Kowlaska')

IF OBJECT_ID('tempdb..#temp') IS NOT NULL
	DROP TABLE #temp

CREATE TABLE #temp (ID INT, separator_1 INT, separator_2 INT)

INSERT INTO #temp (ID)
SELECT ID FROM ciagi_znakow

DECLARE @ptr INT = 26

WHILE EXISTS (SELECT ID FROM #temp WHERE separator_1 IS NULL)
BEGIN
	UPDATE t
	SET t.separator_1=IIF(t.separator_1 IS NOT NULL,t.separator_1,x.separator_1)
	FROM ciagi_znakow cz
	JOIN #temp t ON t.ID=cz.ID
	CROSS APPLY (SELECT separator_1=iif(SUBSTRING(cz.ciag,@ptr,1)=' ',@ptr,NULL)) x
	WHERE t.separator_1 IS NULL

	SET @ptr-=1
END

SET @ptr=26

WHILE EXISTS (SELECT ID FROM #temp WHERE separator_2 IS NULL)
BEGIN
	UPDATE t
	SET t.separator_2=IIF(t.separator_2 IS NOT NULL,t.separator_2,x.separator_2)
	FROM ciagi_znakow cz
	JOIN #temp t ON t.ID=cz.ID
	CROSS APPLY (SELECT separator_2=iif(SUBSTRING(cz.ciag,@ptr+t.separator_1,1)=' ',@ptr+t.separator_1,NULL)) x
	WHERE t.separator_2 IS NULL

	SET @ptr-=1
END

SELECT	ciag
		,Nazwa=SUBSTRING(ciag,0,separator_1)
		,[Imię 1]=SUBSTRING(ciag,separator_1+1,separator_2-separator_1)
		,[Imię 2]=SUBSTRING(ciag,separator_2+1,25)
FROM ciagi_znakow cz
JOIN #temp t ON t.ID=cz.ID

1 użytkowników online, w tym zalogowanych: 0, gości: 1