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.
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.