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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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