Avatar billede jangravgaard Nybegynder
12. juni 2003 - 08:07 Der er 11 kommentarer og
1 løsning

Fejl i query

Hej

Jeg vil gerne selectere følgende poster:

OrderParcelNumbers.ParcelNumber,
Orders.OrderId,
CargoLine.Weight,
CargoLine.GoodsDescription

fra

TransFleet.dbo.OrderParcelNumbers,
TransFleet.dbo.Orders,
TransFleet.dbo.CargoLine


hvor

CargoLine.OrderId = Orders.OrderId AND
OrderParcelNumbers.OrderId = Orders.OrderId AND ((CargoLine.GoodsDescription='Posten Ekspr') AND (Orders.ReceivedTimeStatus1>{ts '2003-06-12 00:00:00'} And Orders.ReceivedTimeStatus1<{ts '2003-06-12 23:59:59'}) OR (CargoLine.GoodsDescription='Post') AND (Orders.ReceivedTimeStatus1>{ts '2003-06-12 00:00:00'} And Orders.ReceivedTimeStatus1<{ts '2003-06-12 23:59:59'}))

Querien jeg har virker sådan set også, men jeg får dubletter på mit parcelnumber....hvordan undgår jeg det ?
Avatar billede pierrehusted Nybegynder
12. juni 2003 - 08:53 #1
Har du prøvet med en SELECT DISTINCT ??
Avatar billede jangravgaard Nybegynder
12. juni 2003 - 09:27 #2
ja, det løste desværre ikke problemet.....
Avatar billede amerikaner Nybegynder
12. juni 2003 - 14:38 #3
Kan ikke svar uden at har din SQL statement...men det ser ud som du ikke brug JOIN, bare SELECT .... FROM TransFleet.dbo.OrderParcelNumbers, TransFleet.dbo.Orders, TransFleet.dbo.CargoLine WHERE .....

Brug INNER JOIN
Avatar billede jangravgaard Nybegynder
12. juni 2003 - 15:35 #4
Min query ser ud som følger:

SELECT distinct OrderParcelNumbers.ParcelNumber, Orders.OrderId, Orders.ExternOrderId, CargoLine.Weight, CargoLine.GoodsDescription, Orders.ReceivedTimeStatus1 FROM TransFleet.dbo.CargoLine CargoLine, TransFleet.dbo.OrderParcelNumbers OrderParcelNumbers, TransFleet.dbo.Orders Orders WHERE CargoLine.OrderId = Orders.OrderId AND OrderParcelNumbers.OrderId = Orders.OrderId AND ((CargoLine.GoodsDescription='Posten Ekspr') AND (Orders.ReceivedTimeStatus1>{ts '2003-06-12 00:00:00'} And Orders.ReceivedTimeStatus1<{ts '2003-06-12 23:59:59'}) OR (CargoLine.GoodsDescription='Post') AND (Orders.ReceivedTimeStatus1>{ts '2003-06-12 00:00:00'} And Orders.ReceivedTimeStatus1<{ts '2003-06-12 23:59:59'}))

Du må gerne komme med et eksempel på en INNER JOIN.....
Avatar billede jangravgaard Nybegynder
12. juni 2003 - 15:36 #5
hov der kom lidt flere variabler med i selecten, men det betyder ikke noget...
Avatar billede amerikaner Nybegynder
13. juni 2003 - 08:23 #6
Undskyld, jeg har lige læset mailen nu.

Prøve:

SELECT distinct OrderParcelNumbers.ParcelNumber, Orders.OrderId, Orders.ExternOrderId, CargoLine.Weight, CargoLine.GoodsDescription, Orders.ReceivedTimeStatus1
FROM (Orders INNER JOIN OrderParcelNumbers ON Orders.OrderId = OrderParcelNumbers.OrderId) INNER JOIN CargoLine ON Orders.OrderId = CargoLine.OrderId
WHERE ((CargoLine.GoodsDescription='Posten Ekspr') AND (Orders.ReceivedTimeStatus1>{ts '2003-06-12 00:00:00'} And Orders.ReceivedTimeStatus1<{ts '2003-06-12 23:59:59'}) OR (CargoLine.GoodsDescription='Post') AND (Orders.ReceivedTimeStatus1>{ts '2003-06-12 00:00:00'} And Orders.ReceivedTimeStatus1<{ts '2003-06-12 23:59:59'}))
Avatar billede jangravgaard Nybegynder
13. juni 2003 - 09:38 #7
Hej du, jeg har prøvet din query, men der er desværre stadig dubletter. Her er mit resultat:

kollinummer  orderid Ex.O.id vægt                Goodsd dato
106777113326 2075062 1067771 0.22                Post  2003-06-12 16:27:34.000
107055113322 2075140 1070551 1.3999999999999999  Post  2003-06-12 16:17:01.000
107157613330 2074886 1071576 3.52                Post  2003-06-12 16:34:35.000
107281813327 2075079 1072818 0.81000000000000005 Post  2003-06-12 16:29:04.000
107385413331 2074898 1073854 3.52                Post  2003-06-12 16:36:37.000
107385413332 2074898 1073854 3.52                Post  2003-06-12 16:36:37.000
107528413328 2074911 1075284 3.6000000000000001  Post  2003-06-12 16:31:04.000
107534613329 2074953 1075346 1.8                Post  2003-06-12 16:33:05.000
107548613324 2075132 1075486 0.73999999999999999 Post  2003-06-12 16:25:05.000
107548613324 2075132 1075486 5.0                Post  2003-06-12 16:25:05.000
107548613325 2075132 1075486 0.73999999999999999 Post  2003-06-12 16:25:05.000
107548613325 2075132 1075486 5.0                Post  2003-06-12 16:25:05.000
107554013323 2075103 1075540 9.5                Post  2003-06-12 16:19:02.000
107555313321 2075130 1075553 8.0                Post  2003-06-12 16:13:02.000
107561713340 2075230 1075617 1.1599999999999999  Post  2003-06-12 19:37:42.000
107570613336 2075265 1075706 1.0                Post  2003-06-12 18:15:59.000
107570613336 2075265 1075706 16.0                Post  2003-06-12 18:15:59.000
107570613337 2075265 1075706 1.0                Post  2003-06-12 18:15:59.000
107570613337 2075265 1075706 16.0                Post  2003-06-12 18:15:59.000
107570613338 2075265 1075706 1.0                Post  2003-06-12 18:15:59.000
107570613338 2075265 1075706 16.0                Post  2003-06-12 18:15:59.000

Der er et par dubletter...
Avatar billede amerikaner Nybegynder
13. juni 2003 - 09:56 #8
OK, måske vi skal grupper også.  Jeg forset på Danglish.

The query we built assumes that there is a one to one relation between the tables.  That is that we have one post in each of the 3 tables.

TransFleet.dbo.OrderParcelNumbers 
TransFleet.dbo.Orders
TransFleet.dbo.CargoLine

You can see that there are NO duplicates, every post is different from the next based on the fields kollinummer, orderid, Ex.O.id, vægt.

If you want to see sum of vægt (instead of an individual post for each) you will need to group the SQL. Something like:

SELECT DISTINCT OrderParcelNumbers.ParcelNumber, Orders.OrderId, Orders.ExternOrderId, Sum(CargoLine.Weight) AS SumOfWeight, CargoLine.GoodsDescription, Orders.ReceivedTimeStatus1
FROM (Orders INNER JOIN OrderParcelNumbers ON Orders.OrderId = OrderParcelNumbers.OrderId) INNER JOIN CargoLine ON Orders.OrderId = CargoLine.OrderId
WHERE ((CargoLine.GoodsDescription='Posten Ekspr') AND (Orders.ReceivedTimeStatus1>{ts '2003-06-12 00:00:00'} And Orders.ReceivedTimeStatus1<{ts '2003-06-12 23:59:59'}) OR (CargoLine.GoodsDescription='Post') AND (Orders.ReceivedTimeStatus1>{ts '2003-06-12 00:00:00'} And Orders.ReceivedTimeStatus1<{ts '2003-06-12 23:59:59'}))
GROUP BY OrderParcelNumbers.ParcelNumber, Orders.OrderId, Orders.ExternOrderId, CargoLine.GoodsDescription, Orders.ReceivedTimeStatus1
Avatar billede amerikaner Nybegynder
13. juni 2003 - 09:59 #9
Det også betyder at du vil har duplicater hvis andre felt i CargoLine (GoodsDescription) er forskelig mellem den Sum() poster.
Avatar billede jangravgaard Nybegynder
16. juni 2003 - 12:21 #10
hmm, okay
Når du laver "Sum of Weight", kan jeg så være sikker på at jeg har den rigtige vægt for den rigtige kollinummer ?
Avatar billede amerikaner Nybegynder
17. juni 2003 - 09:43 #11
Well, it's a sum.

Lets look at the two posts:
107570613337 2075265 1075706 1.0                Post  2003-06-12 18:15:59.000
107570613337 2075265 1075706 16.0                Post  2003-06-12 18:15:59.000

They become 1 post (with the group query):
107570613337 2075265 1075706 17.0                Post  2003-06-12 18:15:59.000

Because we SUM(CargoLine.Weight).
Avatar billede jangravgaard Nybegynder
17. juni 2003 - 13:07 #12
yes, that much i have understood :-)

but what weight is the correct one ? Your eksample shows the same kollinr with two different weights and only one of them is right. The other weight "belongs" to the other kollinr on that OrderId.
I just think that there should be a way, that ensures I get the right information to what ever kollinr/OrderId I have.
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