Avatar billede hermanlaksko Nybegynder
18. december 2007 - 09:47 Der er 5 kommentarer

Loop gennem 3 tabeller-oversættelse fra VBA til Stored procedure

Jeg har 3 tabeller:
1. Hovedtabel der skal løbes igennem og opdateres på grundlag af 2 "sub" - tabeller.

2. Sub-tabel her skal foretages en opsumering på grundlag af et ID fra hoved tabelen, hvis summen er >0 så sættes en boolean til sand.
3. Sub-tabel ditto, men er summen <0 så sættes en boolean til sand.

Hvis boolean er sand sættes felt i hovedtabel til sand.

Jeg forestiller mig at man kunne løbe hovedtabellen igennem og i dette gennemløb hente data fra sub-tabel 1 ala:
Select * from SubTabel_1 Where ID=HovedTabel!ID

Så evt. en do while sætning som opsumerer værdier fra denne sub-tabel_1

Når dette gennemløb af subtabel_1 er færdigt så gøres ditto med subtabel_2
Og til sidst opdateres hoved tabelen med resultatet af boolean, der så sættes til falsk ligesom opsumerings variablerne sættes til 0.

Er der nogen der har en løsning på dette.
Avatar billede lorentsnv Nybegynder
20. december 2007 - 14:13 #1
Kan du prøve at forklare lidt nærmere, hvad du ønsker.

Du har to sub-tabeller, hvor du ønsker at sette en boolean værdi til true/false i hovedtabellen, afhængig af summering i sub-tabeller?

Er det noget i retnigne af:

UPDATE h
SET    ChckFeltSub1 = CASE
                          WHEN Sub1.Total > 0 THEN -1
                          ELSE 0
                      END
FROM  Hovedtabel h
LEFT JOIN
(SELECT ID,
        Sum(Beløb) AS Total
FROM  SubTabel1
GROUP BY
        ID
        ) Sub1
  ON  h.ID = Sub1.ID   


UPDATE h
SET    ChckFeltSub2 = CASE
                          WHEN Sub2.Total < 0 THEN -1
                          ELSE 0
                      END
FROM  Hovedtabel h
LEFT JOIN
(SELECT ID,
        Sum(Beløb) AS Total
FROM  SubTabel2
GROUP BY
        ID
        ) Sub1
  ON  h.ID = Sub2.ID
Avatar billede lorentsnv Nybegynder
20. december 2007 - 14:15 #2
Ovenstående kan nok også komprimeres ned til én Update:

UPDATE h
SET    ChckFeltSub1 = CASE
                          WHEN Sub1.Total > 0 THEN -1
                          ELSE 0
                      END
      ChckFeltSub2 = CASE
                          WHEN Sub2.Total < 0 THEN -1
                          ELSE 0
                      END
FROM  Hovedtabel h
LEFT JOIN
(SELECT ID,
        Sum(Beløb) AS Total
FROM  SubTabel1
GROUP BY
        ID
        ) Sub1
  ON  h.ID = Sub1.ID   
LEFT JOIN
(SELECT ID,
        Sum(Beløb) AS Total
FROM  SubTabel2
GROUP BY
        ID
        ) Sub1
  ON  h.ID = Sub2.ID
Avatar billede lorentsnv Nybegynder
20. december 2007 - 14:16 #3
Unskyld, glemte komma i SET:

UPDATE h
SET    ChckFeltSub1 = CASE
                          WHEN Sub1.Total > 0 THEN -1
                          ELSE 0
                      END
      ChckFeltSub2 = CASE
                          WHEN Sub2.Total < 0 THEN -1
                          ELSE 0
                      END
FROM  Hovedtabel h
LEFT JOIN
(SELECT ID,
        Sum(Beløb) AS Total
FROM  SubTabel1
GROUP BY
        ID
        ) Sub1
  ON  h.ID = Sub1.ID   
LEFT JOIN
(SELECT ID,
        Sum(Beløb) AS Total
FROM  SubTabel2
GROUP BY
        ID
        ) Sub1
  ON  h.ID = Sub2.ID
Avatar billede lorentsnv Nybegynder
20. december 2007 - 14:16 #4
Prøver igen (med komma) :-|


UPDATE h
SET    ChckFeltSub1 = CASE
                          WHEN Sub1.Total > 0 THEN -1
                          ELSE 0
                      END,
      ChckFeltSub2 = CASE
                          WHEN Sub2.Total < 0 THEN -1
                          ELSE 0
                      END
FROM  Hovedtabel h
LEFT JOIN
(SELECT ID,
        Sum(Beløb) AS Total
FROM  SubTabel1
GROUP BY
        ID
        ) Sub1
  ON  h.ID = Sub1.ID   
LEFT JOIN
(SELECT ID,
        Sum(Beløb) AS Total
FROM  SubTabel2
GROUP BY
        ID
        ) Sub1
  ON  h.ID = Sub2.ID
Avatar billede hermanlaksko Nybegynder
20. december 2007 - 18:06 #5
Hi Lorentsny

Tak for dit svar jeg vil lige teste det og se om "den vil" ;-)
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