Avatar billede overgreat Seniormester
20. april 2021 - 22:03 Der er 5 kommentarer og
1 løsning

Indsætte antal linjer udfra antallet på bestillingslinje

Jeg har insert-statement, hvor jeg gerne vil indsætte 1 linje pr. stk der er bestilt.
Select statement har en antals-kolonne, som kan være 1....x stk.

Hvordan kan man fra f.eks. tabel med:
- vareid, beskrivelse, bestillingsid og antal

...sikre at der i insert-statement indsættes 1 linje (med vareid, beskrivelse og bestillingsid) pr. stk i antal der er bestilt?

Jeg kan kun pt. lave select statement, der laver 1 linje pr bestillingslinje (selvom der er bestilt x-antal stk).

Hvordan kan ovenstående løses?

På forhånd tak
Avatar billede overgreat Seniormester
20. april 2021 - 22:04 #1
note: jeg ønsker at lave select statement der indsætter resultatet i ny tabel... ikke den oprindelige, som jeg beskrev kolonnerne for.
Avatar billede arne_v Ekspert
21. april 2021 - 00:44 #2
Fra SELECT til INSERT er ikke et problem:

INSERT INTO tabel1 SELECT ... FROM tabel ...;
Avatar billede arne_v Ekspert
21. april 2021 - 00:45 #3
Problemet er hvis din SELECT returnerer 1 row med en værdi f.eks. 7 og du vil have INSERT 7 rows.

Det er langt nemmere at kode i et programmerings sprog end i SQL.

Jeg vil dog tro at en stored procedure med en CURSOR kan gøre det.
Avatar billede overgreat Seniormester
22. april 2021 - 14:59 #4
Cursor virker
Avatar billede arne_v Ekspert
22. april 2021 - 15:04 #5
Super.

Vi er dog ovre i noget SQL hvor man kunne overveje om en SP i C# var pænere end en SP i T-SQL.
Avatar billede overgreat Seniormester
23. april 2021 - 09:27 #6
Helt enig - jeg fik faktisk arbejdet mig frem til en supplerende metode, som via lidt join arbejde. Det endte med at være den jeg gik med.
ikke 1:1 kopi - men nedenstående viser strukturen jeg brugte til at få de ønskede linjer.

WITH cte (vareid, leveres_id, antal, rnum)
AS
(
    select  il.vareid, il.leveres_id, il.antal, 1 as rnum
    FROM #itabel il

    UNION ALL

    SELECT il1.vareid, il1.leveres_id, il1.antal, rnum+1
    FROM #itabel il1
        JOIN cte ON il1..vareid = cte.vareid and il1..leveres_id = cte.leveres_id AND cte.rnum < il1.antal
)
SELECT vareid, leveres_id, 1 AS antal
FROM cte
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





CIO
Har du rost din mellemleder i dag? Snart er de uddøde - og det er et tab
Computerworld mener: Mellemledere lever livet farligt: Topledelsen får konstant ideer med skiftende hold i virkeligheden, og moden går mod flade agile organisationer. Men mellemlederen er en overset hverdagens helt med et kæmpe ansvar. Her er min hyldest til den ofte latterliggjorte mellemleder.
Job & Karriere
Eva Berneke stopper som topchef i KMD og flytter til Paris: Her er KMD's nye topchef
Efter syv år på posten som topchef for KMD forlader Eva Berneke selskabet. Nu flytter hun med familien til Paris, hvor hun vil fortsætte sit bestyrelsesarbejde. KMD har allerede afløser på plads.
White paper
Udnyt ressourcerne bedre og skru op for overskuddet
Spildt arbejde, ineffektive processer og ringe forretningsindsigt er blot tre tegn på ringe ressourceudnyttelse. I dette whitepaper får du viden om, hvordan du måler ressourceudnyttelsen – og bruger indsigten operationelt, taktisk og strategisk.