Sign in to follow this  
Followers 0
madmac33

How to do a calculation on an aggregate function in an ExecuteSQL statement

7 posts in this topic

Hi,

 

I have very limited SQL experience and am trying to do some calculations on a SELECT statement in a local FMP database;

 

When I do:

SELECT COUNT(tab) as t, SUM("amounts") as a

FROM SummaryData

WHERE tab >15 GROUP BY tab

 

Result is:

16, -152

17, 113

18, 255

 

When I add in a calculation:

SELECT COUNT(tab) as t, SUM("amounts") as a, a * t

FROM SummaryData

WHERE tab >15 GROUP BY tab

 

Result is (invalid):

?

 
I have tried various combinations that seem to work on standard SQL systems, but Filemaker errors. Does Filemaker SQL not support calculations?
 
Any ideas or pointers would be greatly appreciated.
 
 

Share this post


Link to post
Share on other sites

Lets say that Filemakers SQL power is kinda limited. The more you dive in, the more problems you'll encounter. Filemaker is using SQL since Version 10 I think. You have to give them some time :)

Share this post


Link to post
Share on other sites

Maybe a*t as something? Don't have time to test right now. But I think it is possible.

 

http://filemakerhacks.com/2012/10/19/the-missing-fm-12-executesql-reference/

 

I tried a*t as test, as suggested Fitch, but no luck. Maybe calculations on aggregates just not work with filemaker SQL at this stage, as eluded to by Electric_Soul. 

 

Perhaps I'll have to load up MAMP (does it still exist??) and play with mySQL, etc.

Share this post


Link to post
Share on other sites

When I think about it.......     your query must not work. On which database did your sucsseslfully try your query, where you referenced the aliases in the select  statement?

 

There is a processing order in sql. And this order evaluates aliases with the select statement. The selection of rows comes before that.

 

A simple query like this should not work either, because the where clause doesn't know w. w is being evaluated wit the select clause, and that one comes after there where clause.

 

select weight as w,FROM garbage
where w > 10
 

Share this post


Link to post
Share on other sites

It has been my experience that filemaker FQL does not like it when you mix aggregate functions with non aggregate functions. If you have Filemaker Advanced you could write a recursive custom function that processes your SQL array result to arrive at the desired result.

Share this post


Link to post
Share on other sites

It has been my experience that filemaker FQL does not like it when you mix aggregate functions with non aggregate functions. If you have Filemaker Advanced you could write a recursive custom function that processes your SQL array result to arrive at the desired result.

Instead of a CF you could use the VirtualList technic to do calculations on sql-aggregates.
 
Assuming the table VirtualList is filled with the global variable $$vl and the virtuallist column separator is "||", you could do it like this.
 
Let ( [
 
$$vl = ExecuteSQL ( 
"SELECT COUNT(tab), SUM("amounts") 
FROM SummaryData 
WHERE tab >15 GROUP BY tab"
; "||" ; "" )
 
] ;
 
ExecuteSQL ( 
"SELECT Field01, Field02, NUMVAL(Field01) * NUMVAL(Field02)
FROM VirtualList
WHERE Field01 IS NOT NULL"
; "" ; "" )
 
)
 
the NUMVAL operator is needed, if the virtuallists fields are text fields.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Similar Content

    • By losferwords@outgun.com
      I've been working with SQL databases for about 12 years now, and have stumbled across this monstrosity in a new position - and I really don't get the translation between Filemaker and SQL.
       
      This should work according to the documentation:
      ExecuteSQL ( " SELECT Customer_EVENT::Inv_dollars )  FROM Customer_Event WHERE Customer_EVENT::FlagReview = \" " ; "" ; "" )
      ...or something. I really can't even get a simple SQL Statement just pulling anything more than 1 field to work. Is there a reference out there (not Filemaker or FM14 Bible) that actually explains in detail WHY FQL statements are made the way they are and how each piece interacts?
      I'm not sure I can do this with a calculation, but it's entirely possible. I'm just trying to get a SUM on a certain set of records to display SOMEWHERE in a layout. The fields are from a related table, but have nothing to do with the related records. It's just a way to SUM the objects in a portal by "filtering" the amount.
       
       
    • By Hrcap
      Greetings All
       
      I am looking to add a line into the following code into the 'prepare payload for client' section to select only records that match the following criteria
      I have a variable set called: $additional_settings The field that needs to match with $additional_settings is called _kf_uuid_companys the code that i have already is as follows, i need to add a line into this code to pick records where the field _kf_uuid_companys matches $additional Settings.
      Any help would be greatly appreciated:
       
      "SELECT "
      & $dyn_sql & ", '"
      & $$record_delimiter & "'"
      & " FROM \\"" & $sync_table & "\\""
      & " WHERE " &
       
       
       
      // Exclude records flagged for sync exclusion.
      "( COALESCE ( BS_Exclude, 0 ) = 0 ) " &
       
       
       
       
      // If the client is merging new/updated data with data already on the device...
      // Only include records that have been added/updated since the last pull...
      // And only include data that they did not just push (i.e. no "round tripping!")...
       
      If ( ( $$sync_method = "Merge" )
      and
      ( $last_pull_utc > 0 ) ;
       
      "AND ( BS_UTC_Time > " & $last_pull_utc & " ) " &
       
      "AND ( COALESCE ( BS_Device_ID, 'X' ) <> '" & $client_persistent_id & "') "; "" )
    • By sal88
      Hi all
      I'm trying to find the Client that has the most Job time over the last 30 days, divided by the number of seats that they have. The tables are:
      Clients
      Client_ID, Seats
      Jobs
      Client_IDF, Job_time, Job_Date
      The best I've managed so far is to find the distinct Client_IDF from all Jobs:
      ExecuteSQL ( "SELECT DISTINCT j.log_client_IDF FROM Jobs J WHERE j.Log_date >= ?"; ""; "";  $date_30_days_ago) And then loop through the list and perform the 'divide by seats' calculation for each line
      Or to do something similar but from the Clients table:
      ExecuteSQL ( "SELECT SUM (j.labour_units), c.Name FROM Clients C JOIN Jobs J ON j.log_client_IDF = c.Client_ID WHERE l.Log_date >= ?"; ""; ""; $date_30_days_ago) But no joy in either case when it comes to actually performing calculations within SQL.
      Is this possible in FM SQL?
      Many thanks
    • By Mark Stuller
      Hello
      We are going to take the plunge and setup a sync between our Oracle tables and 'shadow' FileMaker tables and we're seeking input.
      One thing we are wondering about is a 'one-way' sync. We don't want changes to be sync'd back to Oracle. The bigger issue is that we don't want deletions in the Oracle table to be deleted in the FileMaker table. There often are children to these records we don't want deleted or orphaned.
      As well, are there any gotchas we should consider? I've read the Advanced topics and feel mostly comfortable but you never know what you don't know!
      Thanks, Mark
    • By scain101
      I need some help with ExecuteSQL.

      I have a TO “Sales” that is related to Estimates, Inspections, and Proposals via ID_SALES:id_sales.

      I created some simple ExecuteSQL calculations that work on Estimates and Inspections, but the same calculations will not work with the related Proposals TO. 

      ·         I know that the relationship is good because I can get the SUM and COUNT from Proposals with a basic calculation (not ExecuteSQL).

      ·         I know there is not a problem with the name on the related Proposals TO (like a space between words). I've copied and pasted the working calculations and I have started from scratch, and neither works.

      This statement works:

      ExecuteSQL ( "SELECT COUNT

      (ID_ESTIMATES) FROM TO40_ESTIMATES

      WHERE ID_SALES = ? “ ;

      "" ; "" ;

      TO13_sales_ESTIMATES||id_sales::id_sales )

      ---

      This statement does not work:

      ExecuteSQL ( " SELECT COUNT

      (ID_PROPOSAL) FROM TO26_PROPOSALS

      WHERE ID_SALES = ? ";

       "" ; "" ;

      TO13_sales_PROPOSALS||id_sales::id_sales)


       
      Any help would be appreciated.

      SC