Opened 4 years ago
Last modified 4 years ago
#32155 closed New feature
Count() by default uses group by — at Initial Version
Reported by: | Sukhinder Mann | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 2.2 |
Severity: | Normal | Keywords: | |
Cc: | sukhinder.mann@… | Triage Stage: | Unreviewed |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
I am trying to use Count() with Case to find out multiple conditional counts, and count keeps using id
as default group by. I don't want it to use GROUP BY
by default.
Staff.objects.filter(department__id__in=[2,3]).annotate( number_of_managers_in_UK=Sum( Case( When(position="MANAGER", location="UK", then=1), output_field=IntegerField(), ) ), number_of_directors_in_USA=Sum( Case( When(position="DIRECTOR", location="USA", then=1), output_field=IntegerField(), ) ) )
Which creates a SQL query something like this:
SELECT "staff"."id", "staff"."location", "staff"."position", "staff"."salary", "staff"."date_of_birth", COUNT( CASE WHEN "staff"."position" = MANAGER AND "staff"."location" = UK THEN 1 ELSE NULL END ) AS "number_of_managers_in_UK", COUNT( CASE WHEN "staff"."position" = DIRECTOR AND "staff"."location" = USA THEN 1 ELSE NULL END ) AS "number_of_directors_in_USA" FROM "staff" WHERE "staff"."department_id" IN (2, 3) GROUP BY "staff"."id"; -- This group by is unnecessary and spoils the result set
Even though Count
is an Aggregator function in SQL it can be used without GROUP BY
. It would be good if we can have either a parameter or something to specify whether to use group by or not instead of defaulting to GROUP BY
.
Note:
See TracTickets
for help on using tickets.