Forum » Programiranje » 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
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:
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:
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...
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
SELECT prva.polje2, druga.polje2, druga.polje3 FROM prva, druga WHERE prva.polje1=druga.polje1
Zgodovina sprememb…
- spremenil: Kami ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | SQL programiranjeOddelek: Programiranje | 1183 (873) | slitkx |
» | sql-t stored procedureOddelek: Programiranje | 1058 (925) | detroit |
» | [sql]-stevilka vrsticOddelek: Programiranje | 1132 (995) | bmandl |
» | T-SQL FIRST / TOP / MAX...Oddelek: Programiranje | 1498 (1498) | frudi |
» | [MSSQL] QueryOddelek: Programiranje | 1171 (1104) | zigi |