[MSSQL] regels naar kolommen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • bastv
  • Registratie: September 2005
  • Laatst online: 23-06 10:03
Ik probeer dmv sql pivot/unpivot tabel regels om te zetten naar kolommen.

brontabel = OrderOpties
OrderNrOptieCodeOptieWaarde
1234561waarde1
1234562waarde2
1234563waarde3
1234564waarde4

(totaal 300 records per order)

nu wil ik 1 regel met daarin de waarde van optie 2 en 3.
OrderNrOptie2Optie3
123456waarde2waarde3


nu heb ik de volgende query die niet werkt:
SQL:
1
2
3
4
SELECT OrderNr,Optie2,Optie3
FROM OrderOpties
PIVOT (MAX(OptieWaarde) FOR [OptieCode] IN ([Optie2],[Optie3])) AS p
where OrderNr = '123456'


met dit als resultaat:
OrderNrOptie2Optie3
123456NULLNULL
123456waarde2NULL
123456NULLwaarde3
123456NULLNULL


hoe kan ik hier 1 regel van maken?
distinct/group by etc geprobeerd maar kom er niet uit.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Laat ik eerst eens vragen waarom je daar "1 regel" (1 record) van wil maken? Waarom laat je het niet aan je view/report over om hier iets van te bakken?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • bastv
  • Registratie: September 2005
  • Laatst online: 23-06 10:03
omdat dit voor een view nodig is met joins etc.
ook moet er via 1 query alle order info opgehaald worden (software van derden)

Acties:
  • 0 Henk 'm!

  • aawe mwan
  • Registratie: December 2002
  • Laatst online: 26-06 21:59

aawe mwan

Wat ook leuk is:

Ik zou het ongeveer zo doen:

SQL:
1
2
3
4
5
SELECT DISTINCT
 C.OrderNr,
 (SELECT OptieWaarde FROM OrderOpties AS A WHERE A.OptieCode=2 AND A.OrderNr=C.OrderNr) AS Optie2,
 (SELECT OptieWaarde FROM OrderOpties AS B WHERE B.OptieCode=3 AND B.OrderNr=C.OrderNr) AS Optie3
FROM OrderOpties AS C;


Afhankelijk van je database performt zoiets nog best aardig.

„Ik kan ook ICT, want heel moeilijk is dit niet”


Acties:
  • 0 Henk 'm!

  • bastv
  • Registratie: September 2005
  • Laatst online: 23-06 10:03
bovenstaande query is een simpel voorbeeld.
OrderOpties heeft meer dan 300 records per order en ik wil er een stuk of 30 uitlezen, 30 subquerys vind ik niet echt een goede oplossing.

dit moet toch kunnen met pivot/unpivot

Acties:
  • 0 Henk 'm!

  • aawe mwan
  • Registratie: December 2002
  • Laatst online: 26-06 21:59

aawe mwan

Wat ook leuk is:

bastv schreef op dinsdag 25 mei 2010 @ 16:54:
bovenstaande query is een simpel voorbeeld.
Dan denk ik dat jouw brontabel ook meer kolommen heeft dan de gegeven 3 kolommen.
Probeer eens of het helpt als je op de plaats van:

code:
1
FROM OrderOpties


een subquery zet waarmee je alleen de 3 kolommen selecteert uit de tabel OrderOpties die je in de pivot wilt gebruiken. Dat is ook hoe ze het hier doen.

„Ik kan ook ICT, want heel moeilijk is dit niet”


Acties:
  • 0 Henk 'm!

  • bastv
  • Registratie: September 2005
  • Laatst online: 23-06 10:03
super dat was de oplossing!
SQL:
1
2
3
4
5
6
7
SELECT OrderNr,Optie2,Optie3
FROM (
    SELECT OrderNr,OptieCode,OptieWaarde from OrderOpties 
    where OptieCode in ('Optie2','Optie3')
    ) pv
PIVOT (MAX(OptieWaarde) FOR [OptieCode] IN ([Optie2],[Optie3])) AS p
where OrderNr = '123456'

Acties:
  • 0 Henk 'm!

  • Killemov
  • Registratie: Januari 2000
  • Laatst online: 28-05 21:29

Killemov

Ik zoek nog een mooi icooi =)

Je hebt in dit geval toch helemaal geen pivot meer nodig? Als je uit een subquery kunt selecteren, wat je doet, ben je eigenlijk al klaar.

Hey ... maar dan heb je ook wat!


Acties:
  • 0 Henk 'm!

  • bastv
  • Registratie: September 2005
  • Laatst online: 23-06 10:03
pivot heb je wel nodig om het simpel te houden
als je alles op 1 regel wil houden met subquerys moet je de query van aawe mwan in "[MSSQL] regels naar kolommen" gebruiken.
als je dit voor 30+ OrderOpties wilt doen heb je heel wat subquerys nodig wat naast dat het niet echt DRY is ook nog een flinke performance impact heeft.

Acties:
  • 0 Henk 'm!

  • Killemov
  • Registratie: Januari 2000
  • Laatst online: 28-05 21:29

Killemov

Ik zoek nog een mooi icooi =)

bastv schreef op woensdag 26 mei 2010 @ 10:36:
pivot heb je wel nodig om het simpel te houden
als je alles op 1 regel wil houden met subquerys moet je de query van aawe mwan in "[MSSQL] regels naar kolommen" gebruiken.
als je dit voor 30+ OrderOpties wilt doen heb je heel wat subquerys nodig wat naast dat het niet echt DRY is ook nog een flinke performance impact heeft.
Je hebt scheef gelezen of je begrijpt het niet. Je selecteert al uit een subquery ( FROM ( select ... ) ). Dat is echt iets heel anders dan subqueries in je selectie velden gebruiken. ( select ... ( select ...), (select ...) FROM ... )
Gewoon die ene subquery uitbreiden lijkt me genoeg. Maar goed, voor jou (mssql) werkt de pivot ook.

Hey ... maar dan heb je ook wat!

Pagina: 1