» »

T-SQL rows to columns

T-SQL rows to columns

nurmaln ::

mam en problemček

Imam dve tabeli

v prvi so artikli (št, ime...)

000001 | Monitor Samsung 17''
000002 | Monitor Samsung 19''



v drugi so opisi (št artikla, št vrstice, opis)

000001 | 1 | Svetilnost 300
000001 | 2 | Kontrast 1000:1
000001 | 7 | srebrne barve
000002 | 1 | Svetilnost 300
000002 | 2 | Kontrast 1000:1
000002 | 5 | srebrne barve


Rad bi ven dobil za vsak artikel samo eno vrstico, v kateri bodo vsi opisi za artikel

frudi ::

ena možnost:
SELECT	st_artikla,
	CASE st_vrstice WHEN 1 THEN opis END AS opis_1,
	CASE st_vrstice WHEN 2 THEN opis END AS opis_2,
	...
	CASE st_vrstice WHEN 20 THEN opis END AS opis_20
FROM	tabela

iz tega nato narediš select, ki združi vse opise v enega. ampak za ta način mora biti maksimalno število vrstic za posamezen artikel omejeno in vnaprej znano (da lahko napišeš pravo število CASE stavkov). če se ti da igrat z generiranjem dinamičnega SQL stavka, pa se da zaobit tudi to omejitev.

druga možnost je, da narediš kurzor, pravzaprav boš rabil kar dva:

DECLARE @artikel NVARCHAR(6)
DECLARE @opis NVARCHAR(50)
DECLARE @opis_artikla NVARCHAR(4000)

DECLARE @return TABLE(ST_ARTIKLA NVARCHAR(6) NOT NULL, OPIS NVARCHAR(4000) NULL)

DECLARE ArtCursor CURSOR FOR SELECT st_artikla FROM tabela GROUP BY st_artikla ORDER BY st_artikla
OPEN ArtCursor
FETCH NEXT FROM ArtCursor INTO @artikel
WHILE @@FETCH_STATUS = 0 BEGIN
	SET @opis_artikla = ''
	DECLARE OpisCursor CURSOR FOR SELECT opis FROM tabela WHERE st_artikla = @artikel ORDER BY st_vrstice
	OPEN OpisCursor
	FETCH NEXT FROM OpisCursor INTO @opis
	WHILE @@FETCH_STATUS = 0 BEGIN
		SET @opis_artikla = @opis_artikla + @opis
		FETCH NEXT FROM OpisCursor INTO @opis
	END
	CLOSE OpisCursor
	DEALLOCATE OpisCursor
	INSERT INTO @return VALUES (@artikel, @opis_artikla)
	FETCH NEXT FROM ArtCursor INTO @artikel
END
CLOSE ArtCursor
DEALLOCATE ArtCursor


kurzorji imajo ta problem, da so precej počasnejši od dela s seti podatkov, zato se jim izogibaj, če se le da :). seveda boš za ta drug način moral narediti proceduro, ker kurzorjev pač ne moreš stlačit v view ali funkcijo...
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)

Zgodovina sprememb…

  • spremenilo: frudi ()

Kami ::

Nekaj takega :)

SELECT prva.polje2, druga.polje2, druga.polje3 FROM prva, druga WHERE prva.polje1=druga.polje1

Zgodovina sprememb…

  • spremenil: Kami ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

SQL programiranje

Oddelek: Programiranje
81183 (873) slitkx
»

sql-t stored procedure

Oddelek: Programiranje
101058 (925) detroit
»

[sql]-stevilka vrstic

Oddelek: Programiranje
121132 (995) bmandl
»

T-SQL FIRST / TOP / MAX...

Oddelek: Programiranje
61498 (1498) frudi
»

[MSSQL] Query

Oddelek: Programiranje
51171 (1104) zigi

Več podobnih tem