Wynik po przecinku w jednym rekordzie

0

Witam, chciałbym osiągnąć efekt w którym np jeśli dla danego tytułu, w drugiej tabli jest więcej niż jeden autor, to żeby autorów wypisywało mi po przecinku w jednym rekordzie. Mniej więcej o taki Select mi chodzi


Select
 tytuł,
autor case when ( jest wiecej niz jeden autor dla danego id, to nie chce 3 wierszy tylko jeden z autorami po przecinku w kolumnie ( autorzy)
form asortyment a  
join autorzy au on au.id = a.id
0

Moja wersja nie obsługuje ani concat ani ||

0

Co to za baza? Dla przykładu to co chcesz uzyskać w oracle można zrobić funkcją

wm_concat 

(nieudokumentowana) lub listagg

 dostępna chyba od wersji 11
0

no to swietnie ze powiedziales w czym piszesz i jaka wersja i jeszcze piszesz ze nie dziala :D

Twoja odpowiedz jest na zasadzie

pytanie: Kawa czy Herbata?
odpowiedz: TAK

0

MS SQL 2008

0

http://stackoverflow.com/questions/15477743/listagg-in-sqlserver
Tam masz przykład zastosowania oraclowej funkcji listagg w sqlserver. Wrzucasz to w odpowiedni blok case który zrobiłeś i masz pożądany efekt

0

Mój serwer niestety nie obsługuje funkcji LISTAGG

0

@Altaro a moze bys przeczytal link od @woolfik? przeciez tam jest inny link prowadzacy tutaj
http://www.sqlfiddle.com/#!3/0836c/6
a tutaj jest ms sql 2008. Ty taka sama wersje podales. Jak napiszesz ze "nie dziala , to nie zdziw sie, ze nikt Ci nie odpowie, bo Ty zadnych sensownych informacji nie napiszesz...

0

Przyjrzałem się temu i wynik dalej zwraca mi 3 rekordy i nie łączy nic ...

zrobiłem tak :


SELECT 
	a.isbn,
	a.tytul,
	a.ilosc_stron,
	STUFF((SELECT distinct ', ' + so.search from sl_osoba so where ao.osoba_id = so.id FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,0,'') data,
	a.isbn_wersji_papierowej, 
	Data_wydania = (CAST(a.rok_wydania as VARCHAR(50)) + '-' + CASE WHEN LEN(a.miesiac_wydania) = 1  THEN '0'+ cast(a.miesiac_wydania as VARCHAR(50)) ELSE cast(a.miesiac_wydania as VARCHAR(50))END), 
	a.opis,w.nazwa,
	a.indeks 
	FROM asortyment a
	JOIN wydawcy w on a.wydawca_id = w.id 
	JOIN osoby ao ON ao.asortyment_id = a.id
	JOIN sl_osoba so ON ao.osoba_id = so.id
	where a.id ='155'

w tabeli osoby sa kolumny id asortymentu i id osoby. w sl_osoba po id osoby w kolumnie search jest jej imie oraz nazwisko

0

Ech widzę, że nie do końca kumasz jak ta funkcja działa więc łopatologicznie:

  • STUFF FOR XML PATH służy do tego aby wypluć ci zakres danych w postaci stringa po przecinku czyli coś, drugie coś, trzecie coś itd. jako kolumnę w dowolnym zapytaniu. Nie ma więc znaczenia czy w twoim zapytaniu jest STUFF czy napis 'ala ma kota' w kolumnie DATA bo zmienia się tylko wartość tej kolumny, a nie zakres zapytania.
  • Zakres zapytania, o którym pisałem wcześniej ograniczany jest od linii FROM do samego końca tzn. Jeżeli masz w asortyment 1 rekord, w osoby masz nawet 1 rekord, ale w sl_osoba masz 3 rekordy to robiąc takiego joina jak zrobiłeś zapytanie zwróci Ci 3 rekordy zamiast jednego.
  • Jeżeli interesuje Cię dlaczego w załączonym przypadku zmienia Ci się zakres rekordów to odpowiedź brzmi: DISTINCT po FieldA
  • Wydaje mi się, że wystarczy wywalić złączenie z tabelą sl_osoby (jeżeli tam są te 3 rekordy) i problem Ci się sam rozwiąże ale mówię czysto teorytycznie bo nie mam przypadku testowego.
  • Jeżeli jednak z jakichś powodów musisz mieć złączenie w taki sposób jak zrobiłeś to wtedy trzeba pokombinować z GROUP BY
0

Dziękuje wszystkim za pomoc niestety nie osiągnąłem tego co chciałem, więc wykorzystałem XML-a którego parsowałem w pętli.

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