[MSSQL] Return X keer record Y waarbij X in Y staat

Pagina: 1
Acties:

  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
Vraag is simpel, maar ik zie ff niet hoe ik dit kan oplossen...

Ik heb een tabel met artikelen. Nu heb ik een aantal-kolom met hoe vaak het artikel voorkomt in de order (de master table die nu even niet van belang is)

Nu voer ik een query uit om de artikelen van een bepaalde order te verkrijgen. Ik heb echter de detailregels zoveel maal nodig als de waarde van aantal in elk record.

Heeft iemand enig idee hoe ik dit zou kunnen doen?

  • André
  • Registratie: Maart 2002
  • Laatst online: 18-05 16:30

André

Analytics dude

Je kunt met een lus die variabele 7 keer gebruiken :?

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Kun je niet beter in de clientapplicatie het aantal regels herhalen? Waarom heb je zoveel keer de rij nodig?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
André schreef op maandag 20 december 2004 @ 13:14:
Je kunt met een lus die variabele 7 keer gebruiken :?
Je moet als het even kan procedurele code (o.a. lussen) vermijden.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
Het probleem ligt bij de client: die kan ik niet manipuleren. Ik moet de regel X keer aanbieden. Geen lussen en of client-pogrammering dus... :(

Het waarom: er moeten labels met barcodes worden afgedrukt voor elke doos in een levering... Die drukker-code is statisch en druk een label af voor elke regel in de aangeboden dataset (query)

[ Voor 43% gewijzigd door Robbemans op 20-12-2004 13:19 ]


  • J2pc
  • Registratie: Oktober 2002
  • Niet online

J2pc

UT Tux Edition

lekker handige drukker-code 8)7

Moet 't perse in sql? Ik denk namelijk niet dat dit in een gewone query mogelijk is :X (maar ik weet ook niet alles :+)

Maar ik meen me iets te herinneren dat je functies in je sql-server kunt schrijven? Misschien dat je daar wat mee kunt.
Heb er zelf geen ervaring mee, maar het is maar een idee

[ Voor 40% gewijzigd door J2pc op 20-12-2004 13:27 ]

"The computer is incredibly fast, accurate, and stupid. Man is unbelievably slow, inaccurate, and brilliant. The marriage of the two is a challenge and opportunity beyond imagination." © Stuart G. Walesh


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
Wat is een 'gewone query' tov een SQL query?

  • J2pc
  • Registratie: Oktober 2002
  • Niet online

J2pc

UT Tux Edition

een 'gewone' query. Is een standaard select/insert/update query. Waar je dus gewoon rijen uit tabellen bij elkaar zoekt. (puur sql dus)

Wat jij wilt is 1 rij meerdere keren laten voorkomen. Ik ken je db-structuur niet, dus 't is moeilijk om van hier uit te zeggen of 't makkelijk kan met jouw database. Eigenlijk zou je druk-software moeten hebben, waarbij in de regel met product-gegevens ook staat hoe vaak die moet worden afgedrukt.

Maar als je een functie schrijft voor ms sql-server, kan je daar volgens mij vb-code in proppen. Ik weet 't alleen niet zeker. Je zal daar zelf ff achteraan moeten gaan.

Maar goed. Hoe werkt dat dan. Jij bent een applicatie aan 't schrijven die gegevens uit een db moet halen, en die dan door stuurt naar de druk-software? Dan kan je toch in jouw programma die aantallen uitlezen, en daarmee weer een nieuwe dataset opbouwen?

Ik stel me jouw code dan voor als een soort tussenpersoon tussen de drukker en de database.

[ Voor 3% gewijzigd door J2pc op 20-12-2004 13:35 ]

"The computer is incredibly fast, accurate, and stupid. Man is unbelievably slow, inaccurate, and brilliant. The marriage of the two is a challenge and opportunity beyond imagination." © Stuart G. Walesh


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Stap 1: maak een tabel 'nummers' met 1 kolom 'nr' die de getallen 1 t/m hoogste aantal bevat.

Stap 2:

code:
1
2
3
4
SELECT * FROM
      (SELECT ArtikelId, Nr FROM OrderRegels CROSS JOIN Nummers)A
INNER JOIN OrderRegels ON A.ArtikelId = OrderRegels .ArtikelId 
WHERE A.Nr <= OrderRegels.Aantal


Dit moet volgens mij wel werken.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 19-05 13:57

Dido

heforshe

Als je een hulptabelletje aan kunt maken, waarin je 1 veld opneemt (een "regelnummer") en daar records inzet met nummers 1 tot en met, pak hem beet 100, dan kun je daarna een (het is smerig) cartesiaans product selecten:

code:
1
2
3
SELECT tabel.* 
  FROM tabel join hulptabel
 WHERE tabel.aantal =< hulptabel.aantal;


P_de_B: great minds?

[ Voor 5% gewijzigd door Dido op 20-12-2004 13:41 ]

Wat betekent mijn avatar?


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
Ik heb niet genoeg info gegeven... Ik mag geen tijdelijke tabellen aanmaken... Anders zou ik een tijdelijke tabel hebben gevuld vanuit mijn clientapplicatie (als ik die al zou kunenn wijzigen)... Het moet in 1 query gebeuren.
Ik vermoed dat het wel mogelijk is, maar een zeer smerige query oplevert...

P_de_B: Zo ver was ik ook, behalve de CROSS JOIN. Dit kan dus helaas niet... :'(

[ Voor 6% gewijzigd door Robbemans op 20-12-2004 13:50 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
think the same :P
maar helaas niet helemaal, waarom ik er een subquery bijgesleept heb snap ik nu ook niet meer :)
P_de_B: Zo ver was ik ook, behalve de CROSS JOIN. Dit kan dus helaas niet... :\'(
Jawel hoor, dit (en bovenstaande vereenvoudiging van Dido) werkt prima

[ Voor 26% gewijzigd door P_de_B op 20-12-2004 13:51 ]

Oops! Google Chrome could not find www.rijks%20museum.nl


  • J2pc
  • Registratie: Oktober 2002
  • Niet online

J2pc

UT Tux Edition

tja.. dat kan ook natuurlijk

maar dan moet je wel zorgen dat je tabel met nummertjes groot genoeg is.
(wel een beetje smerig jah ;) )

Wel makkelijker dan mijn manier.

En je hoeft helemaal geen cross-join te maken Je kan gewoon een where gebruiken.
Maar als je een join gebruikt, moet je 't wel zo doen:
FROM tabel1 [LEFT]JOIN tabel2 ON tabel1.veld = tabel2.veld

Of gewoon zo
FROM tabel1, tabel2
WHERE tabel1.veld = tabel2.veld

[left] is dus optioneel, ff kijken wat werkt

[ Voor 48% gewijzigd door J2pc op 20-12-2004 13:57 ]

"The computer is incredibly fast, accurate, and stupid. Man is unbelievably slow, inaccurate, and brilliant. The marriage of the two is a challenge and opportunity beyond imagination." © Stuart G. Walesh


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
J2pc schreef op maandag 20 december 2004 @ 13:52:
tja.. dat kan ook natuurlijk
*knip*
En dat werkt ook?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
Ik kan helaas geen tabel toevoegen waarmee ik kan joinen, helaas.

Wat ik dus zoek:

1 query die aan de hand van de waarden in de detail-regel die regel zoveel keer terug geeft als het aantal zonden aanpassingen aan mijn client of aan de database (dus ook geen tijdelijke tabellen)

Het is een 'simpele vraag' zoals ik begoin, maar het antwoord is erg lastig naar mijn idee...

Uiteraard wel hartelijk dank aan iedereen die meedenkt!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Robbemans schreef op maandag 20 december 2004 @ 14:04:
Ik kan helaas geen tabel toevoegen waarmee ik kan joinen, helaas.

Wat ik dus zoek:

1 query die aan de hand van de waarden in de detail-regel die regel zoveel keer terug geeft als het aantal zonden aanpassingen aan mijn client of aan de database (dus ook geen tijdelijke tabellen)

Het is een 'simpele vraag' zoals ik begoin, maar het antwoord is erg lastig naar mijn idee...

Uiteraard wel hartelijk dank aan iedereen die meedenkt!
Waarom kun je geen (tijdelijke) tabellen toevoegen?

Kun je wel stored procs toevoegen?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • J2pc
  • Registratie: Oktober 2002
  • Niet online

J2pc

UT Tux Edition

euh, wat bedoel je precies?

Ik weet (denk) dat je in ms-sql server Functies kan schrijven. Maar hoet dat precies allemaal zit moet je mij niet vragen. Ik werk altijd met dynamische queries uit de code zelf. En dan kan ik de resultaten nog manipuleren zoals ik dat wil ;)

Ik zeg alleen dat je geen (cross)join hoeft te gebruiken, maar dat 't ook gewoon met een where kan. Alleen als je een left/right join wilt. moet je 't met een left/right join doen. Dit omdat je via de where-methode alleen de records krijgt, die dezelfde waarde hebben (in desbetreffende velden) en dat je met een left join alle linker velden krijgt, met eventueel overeenkomende rechter rijen, en omgekeerd bij right join.

/edit
lama dus. kan helemaal niet moet in een query

[ Voor 4% gewijzigd door J2pc op 20-12-2004 14:10 ]

"The computer is incredibly fast, accurate, and stupid. Man is unbelievably slow, inaccurate, and brilliant. The marriage of the two is a challenge and opportunity beyond imagination." © Stuart G. Walesh


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
P_de_B schreef op maandag 20 december 2004 @ 14:05:
[...]

Waarom kun je geen (tijdelijke) tabellen toevoegen?

Kun je wel stored procs toevoegen?
Ik mag NIETS aan welke zijde dan ook aanpassen, omdat ik dat niet in de hand heb... Geen SP's, geen tabellen, geen.... whatever. Het MAG alleen maar 1 query zijn...

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
J2pc schreef op maandag 20 december 2004 @ 14:06:
[...]


euh, wat bedoel je precies?

Ik weet (denk) dat je in ms-sql server Functies kan schrijven. Maar hoet dat precies allemaal zit moet je mij niet vragen. Ik werk altijd met dynamische queries uit de code zelf. En dan kan ik de resultaten nog manipuleren zoals ik dat wil ;)

Ik zeg alleen dat je geen (cross)join hoeft te gebruiken, maar dat 't ook gewoon met een where kan. Alleen als je een left/right join wilt. moet je 't met een left/right join doen. Dit omdat je via de where-methode alleen de records krijgt, die dezelfde waarde hebben (in desbetreffende velden) en dat je met een left join alle linker velden krijgt, met eventueel overeenkomende rechter rijen, en omgekeerd bij right join.
Dan ben ik wel benieuwd naar jouw oplossing :) Volgens mij kan het nl. niet met 'een where'
Let op: de topicstarter wil meerdere dezelfde rijen terug hebben.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • J2pc
  • Registratie: Oktober 2002
  • Niet online

J2pc

UT Tux Edition

P_de_B schreef op maandag 20 december 2004 @ 14:08:
[...]

Dan ben ik wel benieuwd naar jouw oplossing :) Volgens mij kan het nl. niet met 'een where'
Let op: de topicstarter wil meerdere dezelfde rijen terug hebben.
Volgens mij ook niet ;). Daarom vroeg ik of ie functions/stored procedures mag/kan gebruiken. Dan kan je (denk ik) daar een loop in gooien. Maar dat weet ik dus niet zeker.

Mijn oplossing = drukker software die met een simpele parameter kan werken. Namelijk. Aantal. Ik kan me eigenlijk niet goed voorstellen dat dat niet kan.

Met een simpele query, zonder extra tabellen, gaat dit volgens mij niet lukken al je er niet bij mag programmeren.

ik bedoelde alleen dat je niet een (cross)join hoefde te gebruiken voor jullie oplossing, maar dat dat ook met een where kan :)

/edit
misschien een ideetje
Ik weet niet wat voor key je gebruikt voor je label-db. Maar als die van 0-x loopt. kan je die dan niet gebruiken? Dus in plaats van die extra tabel, je eigen tabel gebruiken.

Dan moet je dus wel zeker weten dat daar niks uit verwijderd wordt!!

[ Voor 25% gewijzigd door J2pc op 20-12-2004 14:16 ]

"The computer is incredibly fast, accurate, and stupid. Man is unbelievably slow, inaccurate, and brilliant. The marriage of the two is a challenge and opportunity beyond imagination." © Stuart G. Walesh


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
Het probleem ligt eigenlijk bij het feit dat het aantal in de regel staat. Het is dus eigenlijk al ge' group'eerd. Nu wil ik andere kant op en dit lijkt nogal lastig met SQL...

Ik zet hier zo de definitie even bij, dan 'materialiseert' het wat beter...

master:
code:
1
2
3
4
5
*   RECV_ReceivementId  CODE_TECHNICAL (int)    4   0
    CUST_CustomerId CODE_TECHNICAL (int)    4   0
    SUPP_SupplierId CODE_TECHNICAL (int)    4   0
    RECV_PackersNumber  FLD_DESCRIPTION40 (varchar) 40  0
    RECV_DateReceived   FLD_DATE (datetime) 8   0


detail:
code:
1
2
3
4
*   RECR_ReceivementRowId   CODE_TECHNICAL (int)    4   0
    RECV_ReceivementId  CODE_TECHNICAL (int)    4   0
    ARTI_ArticleId  CODE_TECHNICAL (int)    4   1
    RECR_Quantity   FLD_QTY (int)   4   0


Dit is de ontvangst met de ontvangstregels. Van hieruit wordt (dynamisch) een barcode bepaald voor het artikel, maar die tabellen zijn niet van belang.
Er zullen geen gegevens worden verwijderd uit deze tabel.

[ Voor 88% gewijzigd door Robbemans op 20-12-2004 14:25 ]


  • J2pc
  • Registratie: Oktober 2002
  • Niet online

J2pc

UT Tux Edition

dat is 't ook.
Dat doe je normaal alleen voor een view bijvoorbeeld, zodat je weet hoeveel (dezelfde) records je hebt, zonder dat je ze allemaal moet doorsturen.

Dat zou je label-druk-software ook moeten ondersteuenen :S.

Maar goed, die functionaliteit zit standaard niet als functie in sql (zoals group by dat wel zit). Daarom proberen we een andere methode. Als je een redelijke tabel hebt met een doorlopende nummerreeks van 1-x, kan je die gebruiken, voor de methode zoals hierboven al aangehaald. Op die manier hoef je geen extra tabel te maken. Maar dan moet je wel zeker weten dat die historisch is. Dus dat er nooit wat uitgehaald wordt. Anders klopt je rij niet meer, en ga je labels missen.

"The computer is incredibly fast, accurate, and stupid. Man is unbelievably slow, inaccurate, and brilliant. The marriage of the two is a challenge and opportunity beyond imagination." © Stuart G. Walesh


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
De nummers lopen op key door; het is een IDENTITY veld voor alle tabellen. De reeksen zijn dus 'bekend'.

[ Voor 7% gewijzigd door Robbemans op 20-12-2004 14:26 ]


Verwijderd

Misschien een domme vraag, maar wat let jou om een kopie van die tabel te importeren in een lokale MS Access database of iets dergelijks? Dan kan je manipuleren wat je wilt. Een link naar de LIVE db, en een aantal create-table queries doen wonderen....

Of denk ik te simpel?

  • J2pc
  • Registratie: Oktober 2002
  • Niet online

J2pc

UT Tux Edition

als ik 't goed zie, loopt je RECR_ReceivementRowId door van 1-x

neem dan de methode van hierboven (met de aparte tabel van 1-x) en gebruik daarvoor je detail tabel (daar staan de meeste regels in, de kleinste kans op te kort regels dus).

@Faegan
Niet alleen denk je te simpel, je hebt ook 't topic niet gelezen.
Er mogen geen tabellen worden aangemaakt. Al helemaal niet gewijzigd denk ik dan. Het is de bedoeling dat 't automagisch gaat, en dat je niet voor iedere order allerlei exports moet gaan doen.

[ Voor 37% gewijzigd door J2pc op 20-12-2004 14:35 ]

"The computer is incredibly fast, accurate, and stupid. Man is unbelievably slow, inaccurate, and brilliant. The marriage of the two is a challenge and opportunity beyond imagination." © Stuart G. Walesh


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
@J2pc: Dat kan, maar geeft mogelijk niet genoeg regels terug. De kans is misschien 'klein', maar zeker aanwezig...

Stel, in regel 1 (detail) staat een aantal van 90. Dit is mijn complete ontvangst, dan kan ik maximaal 2 regels teruggeven... (1 + 1) en dat is niet genoeg...

<sigh> waarom kunnen simpele dingen soms zo lastig zijn... :/

  • J2pc
  • Registratie: Oktober 2002
  • Niet online

J2pc

UT Tux Edition

Ja, maar het is volgens mij de enige mogelijkheid....

En hij geeft maximaal zoveel regels terug als er in de tabel staan, de positie van de regel maakt niet uit. maar inderdaad. Als er 1 regel instaat met een aantal van 90, krijg je maar 1 regel terug. (er is immers maar 1 regel waar de index <= 90 is)

Daarom raadde we eerst ook aan om een aparte tabel te maken. Maar dan hou je hetzelfde probleem.


Waarom 't zo moeilijk is? Omdat de label-software te brak is om een aantal te accepteren :P

"The computer is incredibly fast, accurate, and stupid. Man is unbelievably slow, inaccurate, and brilliant. The marriage of the two is a challenge and opportunity beyond imagination." © Stuart G. Walesh


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
Voor wat betreft de brakke code: soms is het niet mogelijk in softwareland om wijzigingen door te drukken 8)

  • J2pc
  • Registratie: Oktober 2002
  • Niet online

J2pc

UT Tux Edition

jep, dat is zeker waar.

Het is alleen vervelend als je 2 pakketten aanschaft/schrijft, maar er dan niet op let of ze wel (goed) met elkaar overweg kunnen |:(

niet jouw schuld denk ik zo ;)

"The computer is incredibly fast, accurate, and stupid. Man is unbelievably slow, inaccurate, and brilliant. The marriage of the two is a challenge and opportunity beyond imagination." © Stuart G. Walesh


  • Robbemans
  • Registratie: November 2003
  • Laatst online: 17-07-2025
Het lijkt nu idd te werken met misbruik van een standaard postcode tabel waarin sequenciele IDs zijn opgeslagen. Er zitten ruim 600.000 record in, dus dat is wel voldoende :D

_/-\o_ Allen dank voor het meedenken _/-\o_

(wat mij betreft mag ie dicht)

[ Voor 9% gewijzigd door Robbemans op 20-12-2004 16:41 ]

Pagina: 1