The from table parameters types are sometimes deduced from the result type which must be explicit.
Other ambiguities arise about the monad type usually.
It is useful to enclose the query in a specific function to solve some ambiguities.
I cannot certify your esqueleto query conformity now but
Try this:
{-# LANGUAGE PackageImports, ConstraintKinds #-}
import Import
import "esqueleto" Database.Esqueleto as E
import "monad-logger" Control.Monad.Logger (MonadLogger)
import "resourcet" Control.Monad.Trans.Resource (MonadResourceBase)
type TCategory = Text -- change it if its different
type TAmount = Double
myQuery :: (PersistQuery (SqlPersist m), MonadLogger m , MonadResourceBase m) =>
SqlPersist m [(E.Value TCategory, E.Value (Maybe TAmount))] -- corrected
myQuery = do
-- your query
E.select $ E.from $ \t -> do
E.groupBy $ t E.^. MyTableCategory
let sum' = E.sum_ (t E.^. MyTableAmount)
E.orderBy [E.desc sum']
return (t E.^. MyTableCategory, sum' )
-- within your handler:
pairListResult <- runDB myQuery
forM_ pairListResult $ \(E.Value categ, E.Value maybeAmount) -> do -- whatever
Update: it compiles