Reputation: 39
This query works fine before I try to grab a count of how many Payments (trans_key) there are against each account (ACCT).
Cannot perform an aggregate function on an expression containing an aggregate or a subquery.
SELECT CONVERT(VARCHAR,D.ACCT) ClientReference,
ISNULL((SELECT S.SD_DATA
FROM SDDATA AS S
WHERE S.DEBT_KEY=D.DEBT_KEY AND S.SD_KEY=36),' ') Division,
REPLACE(RTRIM(DB.FNAME)+' '+RTRIM(DB.LNAME),',',' ') AccountHolder,
CONVERT(VARCHAR,D.DOR,101) ListedDate,
ISNULL((SELECT SA.SD_DATA
FROM SDDATA AS SA
WHERE SA.DEBT_KEY=D.DEBT_KEY
AND SA.SD_KEY=2),' ') AssignmentType,
CONVERT(VARCHAR,D.BAL) CurrentBalance,
CONVERT(VARCHAR,D.ASSIGNED) PlacementBalance,
CONVERT(VARCHAR,isnull((SELECT -1*SUM(TD.DIST_AMT)
FROM TRANSDIST AS TD,TRANS AS T,TRANS_CODE AS TC
WHERE T.DEBT_KEY=D.DEBT_KEY
AND TD.TRANS_KEY=T.TRANS_KEY
AND TC.TRANS_CODE=T.TRANS_CODE
AND TC.TRANS_BILL=1),0)) AmountRecovered,
CONVERT(VARCHAR,isnull((SELECT (-1*SUM(TD.DIST_AMT)+SUM(DIST_NET))
FROM TRANSDIST AS TD,TRANS AS T,TRANS_CODE AS TC
WHERE T.DEBT_KEY=D.DEBT_KEY
AND TD.TRANS_KEY=T.TRANS_KEY
AND TC.TRANS_CODE=T.TRANS_CODE
AND TC.TRANS_BILL=1),0)) AmountApplied,
CONVERT(VARCHAR,isnull((SELECT (-1*SUM(DIST_NET))
FROM TRANSDIST AS TD,TRANS AS T,TRANS_CODE AS TC
WHERE T.DEBT_KEY=D.DEBT_KEY
AND TD.TRANS_KEY=T.TRANS_KEY
AND TC.TRANS_CODE=T.TRANS_CODE
AND TC.TRANS_BILL=1),0)) SMAFees,
COUNT((select trans_key from trans)) as Payments
FROM DEBT AS D,DEBTOR AS DB,STATUS AS ST
WHERE ST.STAT_KEY=D.STAT_KEY
AND DB.DEBTOR_KEY=D.DEBTOR_KEY
AND D.CLIENT_KEY =43
AND ST.CATEGORY='A'
When messing around with the count aggregate function I was able to grab soem data, but not the correct count. It was just giving me the count of all 'Payments' inside the table not the amount for each ACCT.
Upvotes: 0
Views: 948
Reputation: 85046
I feel like your query is written in a very strange way that will make it difficult to debug. A few thoughts:
If possible, stop with the subqueries in your select statement. For example:
ISNULL((SELECT SA.SD_DATA FROM SDDATA AS SA WHERE SA.DEBT_KEY=D.DEBT_KEY AND SA.SD_KEY=2),' ') AssignmentType,
can be converted to
ISNULL(SA.SD_DATA,' ')
...
...
FROM DEBT AS D
LEFT JOIN SDDATA AS SA
ON sa.DEBT_KEY = d.DEBT_KEY
Stop using implied joins
Read up on how GROUP BY works with aggregate functions.
This isn't a solution for your exact problem, but you need to get this query into a workable state and do some basic research if you want to resolve this issue.
Upvotes: 1