Results 1 to 2 of 2

Thread: MS SQL veldwaarden als kolommen

  1. #1
    Senior Member
    Join Date
    Jun 2003
    Location
    Noord-Limburg
    Posts
    533

    MS SQL veldwaarden als kolommen

    Al een tijdje niet meer actief geweest op het forum, maar nu weer een probleempje waar ik niet uit kom.

    Ik heb een selectie van een artikel uit een lijst.
    De waarden die ik wil gebruiken staan in velden, zodat ik per artikel soms meerdere velden heb.
    Deze wil ik per artikel in kolommen (met volgnummer o.i.d).

    Code:
    SELECT TOP 1000 
           
    	   lk.[ARTIKELNR]
          ,MAX(lk.[VERSIENUMMER]) AS Versie
    	  ,CAST (lk.[DATUM] as Date) as Datum 
           
          ,ll.[LABELLIJNVOLGNUMMER]
          ,ll.[LABELTEKST]
    
      FROM [dbo].[M_LABKOP] lk WITH (NOLOCK)
      JOIN [dbo].[M_LABLIJN] ll WITH (NOLOCK) ON (ll.[RSN_LABELNUMMER] = lk.RSN_LABELNUMMER)
    
      WHERE lk.[VERSIENUMMER] = (SELECT MAX([VERSIENUMMER]) FROM [dbo].[M_LABKOP] WHERE [ARTIKELNR] = lk.[ARTIKELNR])
    
      GROUP BY 
    	   lk.[ARTIKELNR]
          ,lk.[VERSIENUMMER]
    	  ,lk.[DATUM]
          ,ll.[LABELLIJNVOLGNUMMER]
          ,ll.[LABELTEKST]
    
    
      ORDER BY lk.[ARTIKELNR], ll.[LABELLIJNVOLGNUMMER] 
    
      GO
    De inhoud van het veld LABELLIJNVOLGNUMMER (met eventueel voorlooptekst) zou dan de kolomnaam moeten zijn met LABELTEKST als waarde.

    Een gedeelte van de Output is:
    Code:
    ARTIKELNR	Versie	Datum	LABELLIJNVOLGNUMMER	LABELTEKST
    01001	133	2021-09-13	1	HAVO GELT KOR4
    01001	133	2021-09-13	2	 
    01001	133	2021-09-13	3	Volledig diervoeder voor (op)fokgelten. Bevat KLAUW-Fit.
    01001	133	2021-09-13	4	Samenstelling: Tarwe, Gerst, Tarwegries, Sojaschroot,
    01001	133	2021-09-13	5	Zonnebloemzaadschroot, Mais, Palmpitschilfers, Haver,
    01001	133	2021-09-13	6	Raapzaadschroot, Bietenpulp, Vinasse, Lecithine,
    01001	133	2021-09-13	7	Bakkerijprodukt, Calciumcarbonaat, Rietmelasse, Palmolie,
    01001	133	2021-09-13	8	Natriumchloride, Soja-olie, Natriumbicarbonaat,
    01001	133	2021-09-13	9	Monocalciumfosfaat, Palmvetzuren
    01001	133	2021-09-13	10	Analyse (per kg): Ruw eiwit 150 g-Ruw vet 45 g-Ruwe celstof 60
    01001	133	2021-09-13	11	g-Ruw as 55,1 g-Ca 7,5 g-P 4,7 g-Natrium 2,3 g-Lysine 8,6 g-
    01001	133	2021-09-13	12	Methionine 2,8 g
    01001	133	2021-09-13	13	Nutritionele toevoegingsmiddelen (toegevoegd per kg):
    01001	133	2021-09-13	14	3a672a Vitamine A 12.000 IE-3a670a 25-hydroxycholecalciferol
    01001	133	2021-09-13	15	50 g-3a700 Vitamine E 100 mg-3b405 Koper (Koper(II)sulfaat-
    01001	133	2021-09-13	16	pentahydraat) 11,2 mg-3b413 Koper (Koper(II)chelaat van
    01001	133	2021-09-13	17	glycine, gehydr.) 3,7 mg-3b103 IJzer (IJzer(II)sulfaat-
    01001	133	2021-09-13	18	monohydraat) 250 mg-3b202 Jodium (Calciumjodaat Anhydraat) 1,5
    01001	133	2021-09-13	19	mg-3b502 Mangaan (Mangaan(II)oxide) 40 mg-3b607 Zink
    01001	133	2021-09-13	20	(Zinkchelaat van glycinehydraat) 25 mg-3b603 Zink (Zinkoxide)
    01001	133	2021-09-13	21	75 mg-3b802 Selenium (Natriumseleniet, gecoate korrels) 0,29
    01001	133	2021-09-13	22	mg-4a24 6-fytase EC3.1.3.26 750 FTU-E310 Propylgallaat  0,07
    01001	133	2021-09-13	23	mg-E321 Butylhydroxytolueen 0,83 mg-E562 Sepioliet 1,97 g
    01001	133	2021-09-13	24	 
    01001	133	2021-09-13	25	 
    01001	133	2021-09-13	26	Bij voorkeur te gebruiken binnen 3 maanden na levering.
    01001	133	2021-09-13	27	Volgens eisen GF Welfare voeders (Vion). Voldoet aan de
    Kan iemand mij verder helpen?

    Iets gevonden, maar daar kom ik niet uit:
    https://stackoverflow.com/questions/15745042/efficiently-convert-rows-to-columns-in-sql-server
    Mensen hebben meestal geen bezwaar op kritiek zolang het anderen betreft.

  2. #2
    Senior Member
    Join Date
    Jun 2003
    Location
    Noord-Limburg
    Posts
    533

    Oplossing 1

    Intussen heb ik wel een oplossing gevonden:

    Code:
    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    select @cols = STUFF((SELECT ',' + QUOTENAME(CONCAT('L',LABELLIJNVOLGNUMMER)) 
                        from [dbo].[M_LABLIJN]
                        group by LABELLIJNVOLGNUMMER
                        order by [LABELLIJNVOLGNUMMER]
    
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    set @query = 'SELECT [ARTIKELNR], Versie, Datum,  ' + @cols + ' from 
                 (
    
    				SELECT  
    					   lk.[ARTIKELNR]
    					  ,MAX(lk.[VERSIENUMMER]) AS Versie
    					  ,CAST (lk.[DATUM] as Date) as Datum 
    					  ,CONCAT(''L'',ll.[LABELLIJNVOLGNUMMER]) AS Regel
    					  ,ll.[LABELTEKST]
    
    				  FROM [dbo].[M_LABKOP] lk WITH (NOLOCK)
    				  JOIN [dbo].[M_LABLIJN] ll WITH (NOLOCK) ON (ll.[RSN_LABELNUMMER] = lk.RSN_LABELNUMMER)
    
    				  WHERE lk.[VERSIENUMMER] = (SELECT MAX([VERSIENUMMER]) FROM [dbo].[M_LABKOP] WHERE [ARTIKELNR] = lk.[ARTIKELNR])
    
    				  GROUP BY 
    					   lk.[ARTIKELNR]
    					  ,lk.[VERSIENUMMER]
    					  ,lk.[DATUM]
    					  ,ll.[LABELLIJNVOLGNUMMER]
    					  ,ll.[LABELTEKST]
    
                ) x
                pivot 
                (
                    max(LABELTEKST)
                    for Regel in (' + @cols + ')
                ) p '
    
    exec sp_executesql @query;
    Maar als ik deze in een view wil zetten, dan krijg ik:

    Code:
    Msg 156, Level 15, State 1, Procedure LABELS1, Line 6
    Incorrect syntax near the keyword 'DECLARE'.
    Nu heb ik intussen al uit gevonden dat in een view geen variabelen kunnen worden gebruikt, maar hoe kan ik het dan wel oplossen al ik toch een view wil gebruiken?
    Mensen hebben meestal geen bezwaar op kritiek zolang het anderen betreft.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •