Avatar billede zyfer Nybegynder
04. maj 2010 - 21:04 Der er 9 kommentarer og
1 løsning

Hjælp til SQL forespørgsel..

Hej alle Eksperter..

Jeg har et SQL problem som jeg kan komme videre med..

Problem :

Jeg har følgende data :

ID - Tal1 - Tal2 - LinkId
1 -  15 -  10  -  NULL
2 -    5 -  5  -  NULL
3 -    8 -  5  -  NULL
4 -  (-15) - (-10)-  1


LinkID er et link til ID, altså er ID-4 genereret af ID-1..

Jeg skal bruge en SUM af tal1 og Tal2..

Problemet er så at jeg skal filtrere ID-1 og ID-4 fra.
Id-4 er jo nem nok(Filter på LinkID), men hvad med ID-1 ??

Resultatet skulle gerne blive :

TAL1  -  TAL2
13  -  10


Håber nogen kan hjælpe...eller guide mig i den rigtige retning..
Avatar billede Syska Mester
04. maj 2010 - 21:13 #1
Hej,

Godt lide starten ... "Jeg har et SQL problem som jeg kan komme videre med..", men der mangler sikkert et "ikke" :-)

Du skal nok kigge på CTE:
http://www.google.dk/#hl=da&source=hp&q=common+table+expression+mssql+parent+child&meta=&aq=f&aqi=&aql=&oq=&gs_rfai=&fp=5c262f197fa50aeb

På den måde kan du finde alle ID's og child ID's ... og så kan du jo lave en "NOT IN"

Men om det er pænt ... nej, men tror det kan virke.

Jeg kan ikke lige gennemskue hvad din table kan/skal bruges til, så svært at komme med bedre bud.

mvh
Avatar billede arne_v Ekspert
04. maj 2010 - 21:14 #2
proev:

SELECT SUM(tal1),SUM(tal2)
FROM data d1
WHERE linkid IS NULL AND NOT EXISTS(SELECT * FROM data d2 WHERE d2.linkid = d1.id)
Avatar billede arne_v Ekspert
04. maj 2010 - 21:32 #3
Inspireret at buzzzz's kommentar:

SELECT SUM(tal1),SUM(tal2)
FROM data
WHERE linkid IS NULL AND id NOT IN(SELECT linkid FROM data)
Avatar billede Syska Mester
04. maj 2010 - 21:40 #4
arne_v:
Men det løser vel ikke problemet, hvis han har flere levels af parent/child, så skal han vel ud i CTE.

mvh
Avatar billede zyfer Nybegynder
04. maj 2010 - 21:50 #5
Hej..

og tusinde tak for forslagene..

Jeg vil lige teste lidt med det..

Det er lidt indviklet at forklare det i detaljer, men forstil jer at ID-1,2,3 er Ordre. Ordren bliver så Krediteret(ID-4), derfor LINKID.

Jeg kan komme ud for at Ordre/Kreditnota ikke er ens, så jeg er nød til og fjerne dem helt fra summen, ellers ville de bare udligne hinanden...
ID - 1,2,3,4 er ikke primær nøglen i tabellen, men ordre nr..
Jeg skal opsummere alle ordre(SUM) på et givent projekt, så der er et projekt ID som nøgle.(er jo det samme på de 4 ordre her)..
Avatar billede arne_v Ekspert
04. maj 2010 - 22:21 #6
Mine forslag virker uden CTE hvis det er alle som enten linker eller er linket til.

CTE er noedvendigt hvis man skal foelge links i flere niveauer, men det kan jeg ikke se er noedvendigt her.
Avatar billede Syska Mester
04. maj 2010 - 22:51 #7
Nej, efter hans forklaring lyder det ikke til at være nødvendigt.

mvh
Avatar billede zyfer Nybegynder
05. maj 2010 - 09:47 #8
Hej Igen..

Har nu testet på det, men kan ikke få det til og virke...

Her der den rigtige kode :

SELECT    ORDER.DATA14, SUM(ORDER.SUM_N) AS N, SUM(ORDER.SUM_B) AS B, SUM(ORDER.SUM_COST) AS COST, SUM(ORDER.DB) AS DB,    AVG(ORDER.DG) AS DG
FROM        ORDER INNER JOIN
                      PROJ ON ORDER.DATA1 = PROJ.PROJID
WHERE    (ORDER.LINKID NOT IN(SELECT ORDER.BACKLINK
                            FROM ORDER AS ORDER_1)) AND (ORDER.STATUSID = 5200) OR
                      (ORDER.STATUSID = 5600) OR
                      (ORDER.STATUSID = 5700)
GROUP BY ORDER.DATA1

EKS. i første post :

LINKID = ID-1,2,3,4
BACKLINK = LINKID
Avatar billede zyfer Nybegynder
05. maj 2010 - 10:45 #9
Hej har fundet løsningen..

Det virker nu, med NOT EXISTS.....

Smid lige et svar Arne_v...
Avatar billede arne_v Ekspert
05. maj 2010 - 17:08 #10
ok
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