I am using nestjs with typeorm pgsql.
i want to get count of my leads based on passed timezone so i am using
async getEnquiryCounts(year: string, timezone: string): Promise<ApiResponseDto<any>> {
const stats = await this.enquiryRepo
.createQueryBuilder('enquiries')
.select("EXTRACT(MONTH FROM enquiries.createdAt AT TIME ZONE ':timezone') as month")
.addSelect('COUNT(*)', 'totalEnquiries')
.addSelect('SUM(CASE WHEN enquiries.status = :newLead THEN 1 ELSE 0 END)', 'newLead')
.addSelect('SUM(CASE WHEN enquiries.status = :docUpload THEN 1 ELSE 0 END)', 'docUpload')
.addSelect('SUM(CASE WHEN enquiries.status = :inProgress THEN 1 ELSE 0 END)', 'inProgress')
.addSelect('SUM(CASE WHEN enquiries.status = :rejected THEN 1 ELSE 0 END)', 'rejected')
.addSelect('SUM(CASE WHEN enquiries.status = :agreementCreated THEN 1 ELSE 0 END)', 'agreementCreated')
.addSelect('SUM(CASE WHEN enquiries.status = :didNotProceed THEN 1 ELSE 0 END)', 'didNotProceed')
.where("DATE_PART('year', enquiries.createdAt AT TIME ZONE ':timezone') = :year", { year: year })
.groupBy("EXTRACT(MONTH FROM enquiries.createdAt AT TIME ZONE ':timezone')")
.setParameters({
newLead: EnquiryStatus.NewLead.toString(),
docUpload: EnquiryStatus.DocUpload.toString(),
inProgress: EnquiryStatus.InProgress.toString(),
rejected: EnquiryStatus.Rejected.toString(),
agreementCreated: EnquiryStatus.AgreementCreated.toString(),
didNotProceed: EnquiryStatus.DidNotProceed.toString(),
timezone: timezone,
})
.getRawMany();
const monthsWithData = stats.map((item) => parseInt(item.month));
const yearRange = Array.from({ length: 12 }, (_, i) => i + 1);
const finalStats = yearRange.map((month) => {
const foundMonthIndex = monthsWithData.indexOf(month);
if (foundMonthIndex === -1) {
return {
month: month.toString(),
totalEnquiries: '0',
rejected: '0',
agreementCreated: '0',
inProgress: '0',
newLead: '0',
docUpload: '0',
didNotProceed: '0',
};
} else {
return stats[foundMonthIndex];
}
});
return { data: finalStats };
}
but this is showing
[Nest] 37372 - 06/01/2024, 12:46:36 PM ERROR [ExceptionsHandler] column "enquiries.created_at" must appear in the GROUP BY clause or be used in an aggregate function
QueryFailedError: column "enquiries.created_at" must appear in the GROUP BY clause or be used in an aggregate function
at PostgresQueryRunner.query (E:PROJECTSbackendsrcdriverpostgresPostgresQueryRunner.ts:299:19)
at processTicksAndRejections (node:internal/process/task_queues:95:5)
but plain query on pgsql admin like this is working
SELECT
EXTRACT(MONTH FROM enquiries.created_at AT TIME ZONE 'Asia/Calcutta') AS month,
COUNT(*) AS "totalEnquiries",
SUM(CASE WHEN enquiries.status = 'NewLead' THEN 1 ELSE 0 END) AS "newLead",
SUM(CASE WHEN enquiries.status = 'DocUpload' THEN 1 ELSE 0 END) AS "docUpload",
SUM(CASE WHEN enquiries.status = 'InProgress' THEN 1 ELSE 0 END) AS "inProgress",
SUM(CASE WHEN enquiries.status = 'Rejected' THEN 1 ELSE 0 END) AS "rejected",
SUM(CASE WHEN enquiries.status = 'AgreementCreated' THEN 1 ELSE 0 END) AS "agreementCreated",
SUM(CASE WHEN enquiries.status = 'DidNotProceed' THEN 1 ELSE 0 END) AS "didNotProceed"
FROM
enquiries
WHERE
DATE_PART('year', enquiries.created_at AT TIME ZONE 'Asia/Calcutta') = 2024
GROUP BY
EXTRACT(MONTH FROM enquiries.created_at AT TIME ZONE 'Asia/Calcutta');
this is working and showing correct results
any help on this or i am missing somehting?
1