SQL: twee rows naar een column

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • 107mb
  • Registratie: Juni 2004
  • Nu online
ik heb een query geschreven die het volgende genereert:

ordernummerregelnummerartikelnummeromschrijving
123411000laminaat 1, aantal 1
123411000laminaat 2, aantal 1
123511001laminaat 1, aantal 2



Het betreft hier een product (een gelamineerde plaat) waarvan het laminaat beschreven wordt. Een plaat kan dus 1 omschrijving hebben (beide zijden zelfde laminaat) of twee omschrijvingen (beide zijden verschillend laminaat).

Ik wil dus een query schrijven met het volgende resultaat.
ordernummerregelnummerartikelnummeromschrijving 1omschrijving 2
123411000laminaat 1, aantal 1laminaat 2, aantal 1
123511001laminaat 1, aantal 2



Ik ben al met de pivot-functie aan de slag geweest, maar daar krijg ik het niet voor elkaar, omdat ik met een aggregrate moet werken.

Als ik op strings ga zoeken, dan lukt dat ook niet, omdat overal strings worden samengevoegd tot één kolom. Wie stuurt mij de goede kant op?

Alle reacties


Acties:
  • 0 Henk 'm!

  • FeronIT
  • Registratie: Mei 2015
  • Laatst online: 01-10 17:54
Left join naar zichzelf en dan de omschrijving van het 2e record in omschrijving2 zetten:
code:
1
2
3
4
select o.ordernummer, o.regelnummer,o.artikelnummer, a.omschrijving as omschrijving1 , isnull(a2.omschrijving,'') as omschrijving2
from orderregels o
inner join artikel a on a.artikelnummer = o.artikelnummer and a.kant in ('voorkant', 'beide')
left join artikel a2 on  a2.artikelnummer = o.artikelnummer and a2.kant = 'achterkant'


Even tabelnamen en veldnamen bij elkaar gegokt

Acties:
  • 0 Henk 'm!

  • 107mb
  • Registratie: Juni 2004
  • Nu online
dit is een optie, ik heb echter geen 'kant' o.i.d.
Een optie is dat ik aantal regels per ordernummer-regelnummer ga tellen. count = 1 == voorkant, count = 2 == achterkant.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
107mb schreef op maandag 19 maart 2018 @ 11:05:
Wie stuurt mij de goede kant op?
Dit is typisch iets dat je normaliter in de applicatielaag oplost en niet in de query. Dus laten we eens met de vraag "waarom wil je dit in een query oplossen" beginnen? ;)

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!

  • 107mb
  • Registratie: Juni 2004
  • Nu online
je hebt helemaal gelijk, echter:
we hebben een ERP pakket met machine-aansturing die inhouse ontwikkeld is. De database en software is ontworpen en gebouwd door een van oorsprong niet-ICT-er (inmiddels gepensioneerd bijzonder slimme man). Alle onvolkomenheden in de database zijn opgelost in de applicatie. Omdat het een enorm pakket geworden is, kan ik niet zomaar iets aanpassen.

Voorbeeld: als het laminaat aan beide zijden gelijk is, dan laat je alle velden die de andere kant beschrijven leeg. Zit er niets op de andere kant, dan is daar in een ander veld een code voor? Dat maakt het voor iemand die met de DB werkt erg lastig.

Acties:
  • 0 Henk 'm!

  • BlueZero
  • Registratie: Mei 2007
  • Laatst online: 10-09 15:45
Zonder JOINS wordt dit een lastige om uit te voeren omdat je extra kolommen gaat toevoegen in het resultaat. Echter dan moet je voor elke extra omschrijving een extra JOIN toevoegen.

Waar je wel naar zou kunnen kijken is GROUP_CONCAT.

Acties:
  • 0 Henk 'm!

  • labee
  • Registratie: November 2002
  • Laatst online: 10-09-2022
Even uit de losse pols:

code:
1
2
3
4
5
6
select ordernummer, regelnummer, artikelnummer,
  max(case when omschrijving = 'laminaat 1' then omschrijving end) as omschrijving1,
  max(case when omschrijving = 'laminaat 2' then omschrijving end) as omschrijving2
from OrderRegelsTabel
group by ordernummer, regelnummer, artikelnummer
--order by ordernummer, regelnummer, artikelnummer


de max wordt "gebruikt" om ervoor te zorgen dat de waarde niet in de group by hoeven.

http://www.labee.nl


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
pivotting is altijd lastig... vooral als het aantal kolommen dat mogelijk is onbeperkt is. Ik krijg de indruk dat jij echter maar max twee kolommen hebt, dat maakt het al makkelijker.
Een truuk is dan om gebruik te maken van de sortering van elementen in de join, zodat je een soort teller genereert die aangeeft hoeveel elementen er gelijk zijn. (hier moet je dan zelf even wat ifjes bij bedenken)
SQL:
1
2
3
4
5
6
7
8
SELECT DISTINCT
A.*,
COUNT(DISTINCT B.omschrijving)
FROM
mijntabel A
LEFT JOIN 
mijntabel B 
ON A.ordernummer = B.ordernummer AND A.regelnummer = B.regelnummer AND A.omschrijving <= B.omschrijving


Overigens, als je altijd max 2 kolommen hebt, kun je dit wellicht ook met een subquery oplossen door:
pseudo:
SQL:
1
2
3
4
5
SELECT
IF((SELECT aantaloschrijving FROM mijntabel WHERE blabla) = 1, mijntabel.omschrijving, '') as kol1,
IF((SELECT aantaloschrijving FROM mijntabel WHERE blabla) = 2, mijntabel.omschrijving, '') as kol2
FROM
 mijntabel
Pagina: 1