Avatar billede komputerdk Mester
21. februar 2018 - 12:00 Der er 6 kommentarer

Rækker til kolonner

Hej

Jeg har en tabel med x antal produkter, med y antal egenskaber.
fx

ID | Beskrivelse_id | Beskrivelse |  Sprog
1  |  500                | Rød            | DK
1  | 500                  | Red            | US
1  | 521                  | 230V          | DK
2  | 500                  | Hvid          | DK

jeg vil gerne have outputtet så hver ID har en række med

ID | 500  | 521  | Sprog
1  |  Rød | 230v |DK 

Der er rigtig mange beskrivelses_id'er (ca 5000) , men jeg skal kun bruge ca 30.

Ved ikke om nedenstående hjælper eller det bare er total forvirring?

jeg har prøvet denne
https://stackoverflow.com/questions/15745042/efficiently-convert-rows-to-columns-in-sql-server

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(Beskrivelses_id
                    from produkter
                    group by Beskrivelses_id, id
having beskrivelses_id in ('500','501','322') --etc
                    order by id
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)')
        ,1,1,'')

set @query = N'SELECT ' + @cols + N' from
            (
                select beskrivelse, beskrivelses_id
                from produkter
-- jeg har prøvet med en where beskrivelses_id in her, men det fejler
            ) x
            pivot
            (
                max(beskrivelse)
                for Beskrivelses_id in (' + @cols + N')
            ) p '

exec sp_executesql @query;

men jeg får følgende fejl

Msg 1056, Level 15, State 1, Line 1
The number of elements in the select list exceeds the maximum allowed number of 4096 elements.
Msg 102, Level 15, State 1, Line 6
Incorrect syntax near 'x'.
Avatar billede Slettet bruger
21. februar 2018 - 12:22 #1
Skal du kun have det danske sprog? Siden du kun har 2 af de 3 med som er under ID 1?
Avatar billede Slettet bruger
21. februar 2018 - 12:23 #2
Og ved du hvilke beskrivelse_id'er du skal bruge?
Avatar billede Slettet bruger
21. februar 2018 - 12:34 #3
Det her virker fint for mig,

USE LegOgSpass
CREATE TABLE dbo.Pro  (id int, beskrivelse_id int,beskrivelse nvarchar(50),Sprog nvarchar(50))

insert into dbo.pro

values



(1  , 500              ,'Rød'          ,'DK'),
(1  ,500                ,'Red'          ,'US'),
(1  ,521                ,'230V'          ,'DK'),
(2  ,500                ,'Hvid'          ,'DK')


select * from dbo.pro
where Sprog = 'dk'



DECLARE @Str NVARCHAR(MAX);
DECLARE @Str2 NVARCHAR(MAX);
SELECT @Str = STUFF(
                  (
                      SELECT DISTINCT
                              ','+QUOTENAME(beskrivelse_id)
                      FROM dbo.pro FOR XML PATH('')
                  ), 1, 1, '');
PRINT @Str
SET @str2 = N'select ID, '+@Str+',Sprog from (
  select ID, beskrivelse_id,Beskrivelse,Sprog
  from dbo.pro where sprog=''dk''
  )x
  PIVOT
  (Max(Beskrivelse) FOR beskrivelse_id in ('+@Str+')
  ) as p';
PRINT @Str2;
EXEC (@Str2);
Avatar billede Slettet bruger
21. februar 2018 - 12:46 #4
Husk at begræns dine IDer. det gør du herinde

SELECT @Str = STUFF(
(
SELECT DISTINCT
','+QUOTENAME(beskrivelse_id)
FROM dbo.pro where beskrivelse_id in ('500','521') FOR XML PATH('')
), 1, 1, '');


evt. lav den dynamisk så den kun vælger de 30 du skal bruge. Eller hardcode dem hvis du vil.
Avatar billede Slettet bruger
21. februar 2018 - 12:48 #5
Du kan også læse denne hvor jeg kommer med et svar til hvordan du kan lave det i en cursor ellers læs de andre svar, de er også gode:

https://stackoverflow.com/questions/47055053/how-to-make-pivot-query-in-same-table-column-based-on-onther-column/47055490#47055885
Avatar billede Slettet bruger
12. marts 2018 - 17:57 #6
Jeg har set flere af dine spm herinde vælger du ikke at svare tilbage eller acceptere løsningen. Det er dårlig stil uanset hvad. Fik du det løst?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester