Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 189
  • Last Modified:

SUM problem in SQL

Hi, I have a problem with a query and don't know what I'm doing wrong.
I have two Paradox tables: Factuurartikel.db and Temp1.db
I want to get the sum of Factuurartikel.Aantal between the dates Temp1.Datum1 and Temp1.Datum2, where Factuurartikel.Omschrijving = Temp1.Omschrijving.
When i run the query and want to get the result I get 2 (The first result of the query) instead of 39 (Total of Aantal between the given dates.
Here's the SQL text:

SELECT Factuurartikel.Code, SUM(Factuurartikel.Aantal) AS som1, Temp1.Datum1, Temp1.Datum2, Temp1.Omschrijving, Temp1.ArtikelID, Factuurartikel.Omschrijving, Factuurartikel.ArtikelID, Factuurartikel.ArtikelgroepID, Factuurartikel.Datumverkoop
FROM "factuurartikel.DB" Factuurartikel, "temp1.DB" Temp1
WHERE   (Factuurartikel.Omschrijving = Temp1.Omschrijving )  
  AND  Factuurartikel.Datumverkoop BETWEEN Temp1.Datum1 AND Temp1.Datum2  
GROUP BY Temp1.Datum1, Factuurartikel.ArtikelgroepID, Factuurartikel.Code, Temp1.Datum2, Temp1.Omschrijving, Temp1.ArtikelID, Factuurartikel.ArtikelID, FactuurArtikel.Omschrijving, FactuurArtikel.Datumverkoop

Please help ASAP

Thx
Marioway
0
marioway
Asked:
marioway
1 Solution
 
BlackTigerXCommented:
is really hard to tell, your group by is very different from your select, that leads to unexpected results

first of all try grouping by the same as your select:

SELECT Factuurartikel.Code, Temp1.Datum1, Temp1.Datum2, Temp1.Omschrijving, Temp1.ArtikelID, Factuurartikel.Omschrijving, Factuurartikel.ArtikelID, Factuurartikel.ArtikelgroepID, Factuurartikel.Datumverkoop, SUM(Factuurartikel.Aantal) AS som1
FROM "factuurartikel.DB" Factuurartikel, "temp1.DB" Temp1
WHERE   (Factuurartikel.Omschrijving = Temp1.Omschrijving )  
  AND  Factuurartikel.Datumverkoop BETWEEN Temp1.Datum1 AND Temp1.Datum2  
GROUP BY Factuurartikel.Code, Temp1.Datum1, Temp1.Datum2, Temp1.Omschrijving, Temp1.ArtikelID, Factuurartikel.Omschrijving, Factuurartikel.ArtikelID, Factuurartikel.ArtikelgroepID, Factuurartikel.Datumverkoop

other thing that might be messing the query up, is if this is a 1 to many relationship between these 2 tables
0
 
mariowayAuthor Commented:
Hi BlackTigerX, I tried it, but the result is the same. There are no relationships between the two tables. I read through the questions concerning SUM and SQL --> nested query should be used ?

Regards
Mario
0
 
esoftbgCommented:
Try this (I think the GROUP BY clause must contain only fields from Factuurartikel table):

SELECT Factuurartikel.Code, SUM(Factuurartikel.Aantal) AS som1,
       Temp1.Datum1, Temp1.Datum2, Temp1.Omschrijving, Temp1.ArtikelID,
       Factuurartikel.Omschrijving, Factuurartikel.ArtikelID, Factuurartikel.ArtikelgroepID,
       Factuurartikel.Datumverkoop
FROM "factuurartikel.DB" Factuurartikel, "temp1.DB" Temp1
WHERE   (Factuurartikel.Omschrijving = Temp1.Omschrijving )  
  AND  Factuurartikel.Datumverkoop BETWEEN Temp1.Datum1 AND Temp1.Datum2  
GROUP BY Factuurartikel.Code, Factuurartikel.Omschrijving, Factuurartikel.ArtikelID,
         Factuurartikel.ArtikelgroepID, Factuurartikel.Datumverkoop
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
mariowayAuthor Commented:
Hi esoftbg, I get an error ("every simple fieled must ....") .

Regards
Mario
0
 
mokuleCommented:
To get the SUM You must have

SELECT SUM(Factuurartikel.Aantal) AS som1
FROM "factuurartikel.DB" Factuurartikel, "temp1.DB" Temp1
WHERE   (Factuurartikel.Omschrijving = Temp1.Omschrijving ) AND  Factuurartikel.Datumverkoop BETWEEN Temp1.Datum1 AND Temp1.Datum2  

If You want other fields You must decide from which row it should be
0
 
mariowayAuthor Commented:
Hi evrybody, I think I solved this thing another way. The problem was that I always got the first result of the query, and not the total sum of all the records of the query. I did this this way:

   i1:= query17Som1.Value;
     for j:= 1 to query17.RecordCount - 1 do
      begin
       i1:= query17Som1.Value;
       query17.Next;
       i2:= query17som1.Value;
       i1:= i1 + i2;
     end;

The final result of this loop is i1 which is the total of all the records in the query, and this is what I wanted.
If anyone can show me how to do this by using just one query, I would appreciate it.

Regards
Mario
0
 
esoftbgCommented:
Sorry Mario, obviously I am not on a right track ....

Best Regards
Emil

May be you need to use two Query components instead of one Query (The code below is only a suggestion - it is not tested):

QueryTemp1.SQL.Text :=
'SELECT Datum1, Datum2, Omschrijving, ArtikelID
FROM "temp1.DB"';

QueryFactuurArtikel.SQL.Text :=
'SELECT Code, SUM(Aantal) AS som1, Omschrijving, ArtikelID, ArtikelgroepID, Datumverkoop
FROM "factuurartikel.DB"
WHERE   (Omschrijving = :Omschrijving )  AND  Datumverkoop BETWEEN :Datum1 AND :Datum2  
GROUP BY Code, SUM(Aantal) AS som1, Omschrijving, ArtikelID, ArtikelgroepID, Datumverkoop';

And use the event:
procedure Form1.QueryFactuurArtikelBeforeOpen(....);
begin
  QueryFactuurArtikel.ParamByName('Omschrijving').AsString := QueryTemp1.FieldByName('Omschrijving').AsString;
  QueryFactuurArtikel.ParamByName('Datum1').AsString := QueryTemp1.FieldByName('Datum1').AsString;
  QueryFactuurArtikel.ParamByName('Datum2').AsString := QueryTemp1.FieldByName('Datum2').AsString;
end;
0
 
mariowayAuthor Commented:
Emil, As I mentioned above, I ran the this this query:

SELECT Factuurartikel.Code, Temp1.Datum1, Temp1.Datum2, Temp1.Omschrijving, Temp1.ArtikelID, Factuurartikel.Omschrijving, Factuurartikel.ArtikelID, Factuurartikel.ArtikelgroepID, Factuurartikel.Datumverkoop, SUM(Factuurartikel.Aantal) AS som1
FROM "factuurartikel.DB" Factuurartikel, "temp1.DB" Temp1
WHERE   (Factuurartikel.Omschrijving = Temp1.Omschrijving )  
  AND  Factuurartikel.Datumverkoop BETWEEN Temp1.Datum1 AND Temp1.Datum2  
GROUP BY Factuurartikel.Code, Temp1.Datum1, Temp1.Datum2, Temp1.Omschrijving, Temp1.ArtikelID, Factuurartikel.Omschrijving, Factuurartikel.ArtikelID, Factuurartikel.ArtikelgroepID, Factuurartikel.Datumverkoop

and on the result of the query : two variables i1 and i2

     i1:= query17Som1.Value;
     for j:= 1 to query17.RecordCount - 1 do
      begin
       i1:= query17Som1.Value;
       query17.Next;
       i2:= query17som1.Value;
       i1:= i1 + i2;
     end;

i1 now gives me the result I want (= the sum of som1).
Perhaps a nested query could give the same result ?

Regards
Mario

0
 
esoftbgCommented:
Mario,
Could you send me the "factuurartikel" and "temp1" paradox tables to make some test ?

Emil
0
 
esoftbgCommented:
I think it should be:

    Query17.First;
    i1 := 0;
    while not Query17.EOF do
    begin
      i1 := i1 + Query17Som1.Value;
      Query17.Next;
    end;

but it will be better if I can test using real paradox tables ....

Emil
0
 
Pierre CorneliusCommented:
Try this:

SELECT
  F.Code, F.Omschrijving, F.ArtikelID, F.ArtikelgroepID, F.Datumverkoop, SUM(F.Aantal) AS som1  
FROM "factuurartikel.DB" F
  FULL OUTER JOIN "temp1.DB" T ON F.Omschrijving = T.Omschrijving
WHERE
  Factuurartikel.Datumverkoop BETWEEN T.Datum1 AND T.Datum2  
GROUP BY
  F.Code, F.Omschrijving, F.ArtikelID, F.ArtikelgroepID, F.Datumverkoop


Regards
Pierre
0
 
mariowayAuthor Commented:
Emil, the solution you sent me is perfect. Query now is:

SELECT SUM(Aantal) AS som1, Omschrijving, Code, ArtikelgroepID
FROM "factuurartikel.DB"
WHERE (Omschrijving = :Omschrijving )
      AND (Datumverkoop >= :Datum1 )
      AND (Datumverkoop <= :Datum2 )
GROUP BY Omschrijving, Code, ArtikelgroepID

thank you very much
Mario

0
 
esoftbgCommented:
Mario, you are welcome
Emil
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now