Avatar billede cowfoot1 Nybegynder
03. januar 2012 - 23:51 Der er 6 kommentarer og
1 løsning

Har en left outer join mellem 2 tabeller og skal nu have en 3. tabel joinet på

Hej

Jeg har i dag denne SQL jeg sender igennem Excel MS Query builder mod Navision:

SELECT "Cust_ Ledger Entry"."Customer No_", "Cust_ Ledger Entry"."Document No_", "Cust_ Ledger Entry"."Document Type", "Cust_ Ledger Entry".Description, "Cust_ Ledger Entry"."Document Date", "Cust_ Ledger Entry"."Due Date", Sum("Detailed Cust_ Ledg_ Entry".Amount), "Cust_ Ledger Entry"."Currency Code", "Cust_ Ledger Entry"."Last Issued Reminder Level", "Cust_ Ledger Entry"."Entry No_"
FROM {oj dbo."Cust_ Ledger Entry" "Cust_ Ledger Entry" LEFT OUTER JOIN dbo."Detailed Cust_ Ledg_ Entry" "Detailed Cust_ Ledg_ Entry" ON "Cust_ Ledger Entry"."Entry No_" = "Detailed Cust_ Ledg_ Entry"."Cust_ Ledger Entry No_"}
Where ("Cust_ Ledger Entry".[Open]=1)
GROUP BY "Cust_ Ledger Entry"."Customer No_", "Cust_ Ledger Entry"."Document No_", "Cust_ Ledger Entry"."Document Type", "Cust_ Ledger Entry".Description, "Cust_ Ledger Entry"."Document Date", "Cust_ Ledger Entry"."Due Date", "Cust_ Ledger Entry"."Currency Code", "Cust_ Ledger Entry"."Last Issued Reminder Level", "Cust_ Ledger Entry"."Entry No_"

Jeg mangler at få kundenavnet på som ligger i en 3. tabel: "Customer".Name

Tabellen hedder "Customer" og hvis jeg skal vise hvordan "Customer" hænger på "Cust_ Ledger Entry" ser det sådan ud:

SELECT "Customer".Name
FROM dbo."Cust_ Ledger Entry" "Cust_ Ledger Entry", dbo."Customer" "Customer"
WHERE "Cust_ Ledger Entry"."Customer No_" = "Customer".No_


Opgaven er altså, at få den øverste SELECT sætning til at indeholde "Customer".Name fra tabellen dbo."Customer".

Kan du hjælpe?

Bonus spørgsmål: Den SUM jeg laver på Amount får en blank overskrift og bliver i Excel konverteret til "Column 1". Hvis jeg ville have den hed "Udestående", hvad gør jeg så?
04. januar 2012 - 11:12 #1
Jeg må lige sige, at jeg arbejder med mysql, ikke mssql, men jeg går ud fra, at det følgende vil virke også i mssql.

For så at svare på dit direkte spørgsmål, hvordan du får kundenavnet med i din query:  Først skal Customer.Name indføjes i SELECT'en, jeg har givet det plads nummer to, lige efter customerno.  Yderligere skal FROM sektionen udbredes med en ekstra join.  Hvis din forespørgsel virker som skrevet, så skulle denne udvidelse også virke:

SELECT "Cust_ Ledger Entry"."Customer No_", Customer.Name, "Cust_ Ledger Entry"."Document No_", "Cust_ Ledger Entry"."Document Type", "Cust_ Ledger Entry".Description, "Cust_ Ledger Entry"."Document Date", "Cust_ Ledger Entry"."Due Date", Sum("Detailed Cust_ Ledg_ Entry".Amount), "Cust_ Ledger Entry"."Currency Code", "Cust_ Ledger Entry"."Last Issued Reminder Level", "Cust_ Ledger Entry"."Entry No_"
FROM {oj dbo."Cust_ Ledger Entry" "Cust_ Ledger Entry"
LEFT OUTER JOIN dbo."Detailed Cust_ Ledg_ Entry" "Detailed Cust_ Ledg_ Entry" ON "Cust_ Ledger Entry"."Entry No_" = "Detailed Cust_ Ledg_ Entry"."Cust_ Ledger Entry No_"
LEFT OUTER JOIN dbo."Customer" "Customer" ON Cust_ Ledger Entry"."Customer No_" = "Customer".No_}
Where ("Cust_ Ledger Entry".[Open]=1)
GROUP BY "Cust_ Ledger Entry"."Customer No_", "Cust_ Ledger Entry"."Document No_", "Cust_ Ledger Entry"."Document Type", "Cust_ Ledger Entry".Description, "Cust_ Ledger Entry"."Document Date", "Cust_ Ledger Entry"."Due Date", "Cust_ Ledger Entry"."Currency Code", "Cust_ Ledger Entry"."Last Issued Reminder Level", "Cust_ Ledger Entry"."Entry No_"

Men jeg kan ikke dy mig for at foreslå, at du giver tabellerne aliaser (øgenavne) så du ikke behøver at gentage de lange tabelnavne. Følgende kode har samme effekt, men er kun halvt så lang og nemmere at overse:

SELECT e."Customer No_", c.Name, e."Document No_", e."Document Type", e.Description, e"Document Date", e."Due Date", Sum(d.Amount), e."Currency Code", e."Last Issued Reminder Level", e."Entry No_"
FROM "Cust_ Ledger Entry" e
LEFT JOIN "Detailed Cust_ Ledg_ Entry" d ON e."Entry No_" = d."Cust_ Ledger Entry No_"
LEFT JOIN "Customer" c ON e."Customer No_" = c.No_
Where e.[Open]=1
GROUP BY e."Customer No_", e."Document No_", e."Document Type", e.Description, e."Document Date", e."Due Date", e."Currency Code", e."Last Issued Reminder Level", e."Entry No_"

Og så har jeg endnu en 'clever ass' bemærkning:  Hvis du forenklede dine navne, således at der ikke forekommer mellemrum og specielle tegn, så kan du droppe anførselstegnene.  Hvis du for eksempel ændrer til disse navne på tabellerne og felterne:

CustomerLedgerEntry
customerno, documentno, documenttype, description, documentdate, duedate, currencycode, lastissuedreminderlevel, entryno, open

DetailedCustLedgerEntry
custledgerentryno, amount

Customer
no, name

så ville du kunne forenkle forespørgslen til dette:

SELECT e.customerno, c.name, e.documentno, e.ocumenttype, e.description, e.documentdate, e.duedate, Sum(d.amount), e.currencycode, e.lastissuedreminderlevel, e.entryno,
FROM CustomerLedgerEntry e
LEFT JOIN DetailedCustLedgerEntry d ON e.entryno = d.custledgerentryno
LEFT JOIN ustomer c ON e.customerno = c.no
Where e.open=1
GROUP BY e.documentno, e.documenttype, e.description, e.documentdate, e.duedate, e.currencycode, e.lastissuedreminderlevel, e.entryno

Jeg har ikke testet dette, da jeg ikke har mssql installeret.  Hvis der er syntaksfejl prøver vi at kikke på det igen.
Avatar billede cowfoot1 Nybegynder
04. januar 2012 - 12:10 #2
Hej Cristian

Tusind tak for god start-hjælp.

Jeg får en syntaksfejl som jeg har siddet og leget med om jeg kunne få væk selv. Det er jeg ikke begavet nok til.

Jeg har taget udgangspunkt i dit 2. forslag, hvor du øgenavner dig igennem. Der sker følgende fejl:

Invalid column name 'e'

Er det i SELECT sætningen jeg skal se efter hvilken column der er noget hat med?
Avatar billede cowfoot1 Nybegynder
04. januar 2012 - 13:05 #3
SÅ VIRKER DET!!! WOOHOO!

SELECT e."Customer No_", c.Name, e."Document No_", e."Document Type", e.Description, e."Document Date", e."Due Date", Sum(d.Amount), e."Currency Code", e."Last Issued Reminder Level", e."Entry No_"
FROM {oj dbo."Cust_ Ledger Entry" e LEFT OUTER JOIN dbo."Detailed Cust_ Ledg_ Entry" d ON e."Entry No_" = d."Cust_ Ledger Entry No_" left outer join dbo."Customer" c ON e."Customer No_" = c.No_}
Where (e.[Open]=1)
GROUP BY e."Customer No_", c.Name, e."Document No_", e."Document Type", e.Description, e."Document Date", e."Due Date", e."Currency Code", e."Last Issued Reminder Level", e."Entry No_"

Har du mulighed for at svare på mit bonus-spørgsmål vedr. den tomme kolonneoverskrift der kommer på SUM(d.Amount) delen?

Jeg kan desværre ikke ændre i tabellerne i Navision til uden mellemrum og special-tegn, det er derfor jeg hoppede på din midterste løsning med det samme.
04. januar 2012 - 13:42 #4
Sum("Detailed Cust_ Ledg_ Entry".Amount) AS 'Udestående'
Avatar billede cowfoot1 Nybegynder
04. januar 2012 - 14:04 #5
Hvor sjovt... jeg har forsøgt et hav af gange med AS 'blablabla' og i Queury builder viser den ikke overskriften, men det gør den i Excel. - så wierd.

Endnu engang - tusind tak for hele opgaven nu er løst. Giv et svar så jeg kan give points.
04. januar 2012 - 14:14 #6
Mit indlæg #1 er et svar, som du skulle kunne acceptere og derved give points og lukke.
Avatar billede cowfoot1 Nybegynder
04. januar 2012 - 14:37 #7
Det var det også. Det så jeg først nu. Sorry.

Endnu engang - mange tak for hjælpen.
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