• 6 odgovora
  • 2.933 pregleda
Moze li u jednom koraku ? 27.08.2008. u 11:42 · pre 221 meseci #1
imam tabelu sa dve kolone prva(int),druga(string)

1 a
1 b
1 c
2 d
2 e
3 f

treba da u jednom koraku dobijem

1 abc
2 de
3 f

a da ne idem kroz kursor. Pokusavao sam, al bezuspesno. Ima li neko resenje ?
poz
Re: Moze li u jednom koraku ? 27.08.2008. u 12:25 · pre 221 meseci #3
Ako koristis SQL 2005 ili 2008 postoji trik sa FOR XMLom , ako u SELECTu stavis neku operaciju umesto cistog polja FOR XML ce tretirati izlaz tog polja ka literal umesto kao node XML-a efektivno spajajuci stringove, ako se jos to uokviri u prazan Tag, dobija se SUM(string), onda se to lepo ubaci kao nested select i voila:

Code:

SELECT DISTINCT a.prva,
    (SELECT '' + b.druga FROM Tabela AS b WHERE a.prva = b.prva FOR XML PATH('')) AS SumaStringova
FROM Tabela AS a



Ako je SQL 2000, postoji fora sa UDF funkcijom koja radi agregaciju po jednom kljucu, pa se onda selektuje kljuc i UDF, imam to negde na mom SQL-u od videcu da ti iskopam.
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Moze li u jednom koraku ? 27.08.2008. u 12:45 · pre 221 meseci #4
Ok, iskopao sam i ovu verziju za SQL2000 i promenio kolone i ime tabele za tvoj primer, znaci kreiras specfijalnu UDF koja vazi za tu tabelu:

Code:

create function spoji(@kljuc int)
returns varchar(8000)
as
begin
    declare @s varchar(8000);
    set @s = '';

    select @s = @s + ISNULL(druga, '')
    from Tabela
    where prva = @kljuc;

    return @s;
end


onda rezultat dobijas sa

Code:

select distinct prva, dbo.spoji(prva)
from Tabela



PS: Mada po strukturi ovog UDFa mislim da nije mnogo brzi nego verzija za kurzorom, ako mozes koristi FOR XML varijantu.
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Moze li u jednom koraku ? 27.08.2008. u 13:13 · pre 221 meseci #5
svaka cast ovo mi je zavrsili posao:

SELECT DISTINCT a.prva,
(SELECT '' + b.druga FROM Tabela AS b WHERE a.prva = b.prva FOR XML PATH('')) AS SumaStringova
FROM Tabela AS a


hvala puno
Re: Moze li u jednom koraku ? 27.08.2008. u 15:07 · pre 221 meseci #6
Odlicno. Imaj samo jednu stvar u vidu, ovo je unsupported feature koji se bazira na nedokumentovanom ponasanju FOR XML izlaza, radi na SQL 2005 i 2008, ali nema garancija da ce raditi i u narednim verzijama, cak nema garancija i da sledeci service pack nece to promeniti.
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Moze li u jednom koraku ? 27.08.2008. u 20:58 · pre 221 meseci #7
Evo da priložim još jedno moguće rešenje - moj omiljeni način za prikaz hijerarhijske liste (dokumentovana rekurzivna CTE, provereno radi na sql2005)

Code:

WITH X (prva, CNT, LISTA, druga, LEN)
    AS (
SELECT prva, COUNT(*) OVER (PARTITION BY prva),
       CAST(druga AS VARCHAR(100)), druga, 1
  FROM t1
 UNION ALL
SELECT X.prva, X.CNT,
       CAST(X.LISTA + E.druga AS VARCHAR (100)),
       E.druga, X.LEN+1
  FROM t1 E, X
 WHERE E.prva = X.prva AND E.druga > X.druga
       )
SELECT TOP 100 PERCENT prva AS prva, LISTA
  FROM X
 WHERE LEN = CNT
 ORDER BY 1
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme