Avatar billede overgreat Forsker
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 Forsker
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 Forsker
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 Forsker
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