SQL将带有COUNT(*)的列添加到我的查询中

SQL将带有COUNT(*)的列添加到我的查询中,sql,postgresql,Sql,Postgresql,我需要添加包含此查询内容的列: SELECT COUNT(*) FROM account_subscriptiongroups WHERE account_subscriptiongroups.active = true AND account_subscriptiongroups.user_id = account_user.id SELECT account_user.id as user_id, account_user.email, account_user.first_

我需要添加包含此查询内容的列:

SELECT COUNT(*) FROM account_subscriptiongroups WHERE account_subscriptiongroups.active = true AND account_subscriptiongroups.user_id = account_user.id
SELECT 
      account_user.id as user_id, account_user.email, account_user.first_name, account_user.last_name, account_user.phone,
      account_subscriptiongroup.id as sub_group_id,
      account_adminaction.description,
      account_adminaction.id as admin_action_id,
      account_adminaction.created_on  as subscription_ended_on
    
    FROM 
      account_adminaction
    
    LEFT JOIN
      account_user ON account_user.id = account_adminaction.user_id
    LEFT JOIN 
      account_subscriptiongroup ON account_adminaction.sub_group_id = account_subscriptiongroup.id
    
    WHERE 
      account_adminaction.created_on >= '2021-04-07' AND account_adminaction.created_on <= '2021-04-13' AND
      ((account_adminaction.description LIKE 'Arrêt de l''abonnement%') OR (account_adminaction.description LIKE 'L''utilisateur a arrêté%'))
    
    ORDER BY
      subscription_ended_on
对于此查询:

SELECT COUNT(*) FROM account_subscriptiongroups WHERE account_subscriptiongroups.active = true AND account_subscriptiongroups.user_id = account_user.id
SELECT 
      account_user.id as user_id, account_user.email, account_user.first_name, account_user.last_name, account_user.phone,
      account_subscriptiongroup.id as sub_group_id,
      account_adminaction.description,
      account_adminaction.id as admin_action_id,
      account_adminaction.created_on  as subscription_ended_on
    
    FROM 
      account_adminaction
    
    LEFT JOIN
      account_user ON account_user.id = account_adminaction.user_id
    LEFT JOIN 
      account_subscriptiongroup ON account_adminaction.sub_group_id = account_subscriptiongroup.id
    
    WHERE 
      account_adminaction.created_on >= '2021-04-07' AND account_adminaction.created_on <= '2021-04-13' AND
      ((account_adminaction.description LIKE 'Arrêt de l''abonnement%') OR (account_adminaction.description LIKE 'L''utilisateur a arrêté%'))
    
    ORDER BY
      subscription_ended_on
在我的WHERE语句中使用这一行:

AND all_sg.active = true
我选择的这一行:

COUNT(all_sg.id)
但我有一个错误:

ERROR:  column "account_user.id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 2:   account_user.id as user_id, account_user.email, account_us...
          ^

我不明白如何正确执行此操作要计数,您需要指定一个应用此计数的组。 因此,您需要在GROUPBY子句中提到您选择的、未在聚合函数中使用的每一列,如COUNT或SUM

或者反过来说:非聚合列必须应用于该特定计数中包含的所有行

因此,在WHERE和ORDER BY子句之间,添加GROUP BY子句:

按帐户\u user.id、帐户\u user.email、帐户\u user.first\u name、帐户\u user.last\u name、帐户\u user.phone分组, 帐户\u subscriptiongroup.id, 帐户\u adminaction.description, 帐户\u adminaction.id, 已在上创建帐户\u adminaction 另一方面,如果希望从其他表中获取计数,则可以添加子选择:

选择 account\u user.id as user\u id、account\u user.email、account\u user.first\u name、account\u user.last\u name、account\u user.phone、, 帐户\u subscriptiongroup.id作为子\u组\u id, 帐户\u adminaction.description, 帐户\u adminaction.id作为管理员\u操作\u id, 帐户\u adminaction.created \u on作为订阅\u结束\u on, 选择计数* 来自帐户\订阅组 其中account\u subscriptiongroups.active=true 而account\u subscriptiongroups.user\u id=account\u user.id作为groupcount 从…起 账户管理行动 左连接 account\u user ON account\u user.id=account\u adminaction.user\u id
要计算某个值,需要指定一个应用该值的组。 因此,您需要在GROUPBY子句中提到您选择的、未在聚合函数中使用的每一列,如COUNT或SUM

或者反过来说:非聚合列必须应用于该特定计数中包含的所有行

因此,在WHERE和ORDER BY子句之间,添加GROUP BY子句:

按帐户\u user.id、帐户\u user.email、帐户\u user.first\u name、帐户\u user.last\u name、帐户\u user.phone分组, 帐户\u subscriptiongroup.id, 帐户\u adminaction.description, 帐户\u adminaction.id, 已在上创建帐户\u adminaction 另一方面,如果希望从其他表中获取计数,则可以添加子选择:

选择 account\u user.id as user\u id、account\u user.email、account\u user.first\u name、account\u user.last\u name、account\u user.phone、, 帐户\u subscriptiongroup.id作为子\u组\u id, 帐户\u adminaction.description, 帐户\u adminaction.id作为管理员\u操作\u id, 帐户\u adminaction.created \u on作为订阅\u结束\u on, 选择计数* 来自帐户\订阅组 其中account\u subscriptiongroups.active=true 而account\u subscriptiongroups.user\u id=account\u user.id作为groupcount 从…起 账户管理行动 左连接 account\u user ON account\u user.id=account\u adminaction.user\u id
您可以左键联接到执行分组和计数的派生表:

SELECT au.id as user_id, au.email, au.first_name, au.last_name, au.phone,
       asg.id as sub_group_id,
       ad.description,
       ad.id as admin_action_id,
       ad.created_on  as subscription_ended_on,
       asgc.num_groups
FROM account_adminaction ad
    LEFT JOIN account_user au ON au.id = ad.user_id
    LEFT JOIN account_subscriptiongroups asg on ON ad.sub_group_id = asg.id
    LEFT JOIN (
      SELECT user_id, count(*) as num_groups
      FROM account_subscriptiongroups ag
      WHERE ag.active
      GROUP by user_id
    ) asgc on asgc.user_id = au.id
WHERE ad.created_on >= '2021-04-07' 
  AND ad.created_on <= '2021-04-13' 
  AND ((ad.description LIKE 'Arrêt de l''abonnement%') OR (ad.description LIKE 'L''utilisateur a arrêté%'))
ORDER BY subscription_ended_on

您可以左键联接到执行分组和计数的派生表:

SELECT au.id as user_id, au.email, au.first_name, au.last_name, au.phone,
       asg.id as sub_group_id,
       ad.description,
       ad.id as admin_action_id,
       ad.created_on  as subscription_ended_on,
       asgc.num_groups
FROM account_adminaction ad
    LEFT JOIN account_user au ON au.id = ad.user_id
    LEFT JOIN account_subscriptiongroups asg on ON ad.sub_group_id = asg.id
    LEFT JOIN (
      SELECT user_id, count(*) as num_groups
      FROM account_subscriptiongroups ag
      WHERE ag.active
      GROUP by user_id
    ) asgc on asgc.user_id = au.id
WHERE ad.created_on >= '2021-04-07' 
  AND ad.created_on <= '2021-04-13' 
  AND ((ad.description LIKE 'Arrêt de l''abonnement%') OR (ad.description LIKE 'L''utilisateur a arrêté%'))
ORDER BY subscription_ended_on

编辑:我的答案与一匹没有名字的马提交的答案相同

两个答案,一个是字面上的,只是解决你提出的问题,另一个是问你所要求的是否真的是你想要的

简单回答:修改所需的查询,将用户id添加到Select中,并从Where子句中删除用户id。现在您有了一个表,该表可以与较大查询的其余部分保持连接

...
Left Join (Select user_id, count(*) as total_count
                   From account_subscriptiongroup
                   Where account_subscriptiongroups.active = true
                   Group By user_id) Z
    On Z.user_id=account_user.id
我怀疑这个数字是否是你真正想要的。这将统计所有时间的每个帐户\ U subscriptiongroup条目,但仅统计活动的条目。较大的查询会返回非活动记录和活动记录,因此,如果您的目标是为某个百分比创建分母,那么您在这里混合了“苹果和桔子”

若您决定取而代之的是查询中记录的用户总数,那个么您可以向更大的查询中再添加一个元素,而无需再添加任何表。使用如下窗口功能:

Select ..., Sum(Case When account_subscriptiongroup.active Then 1 else 0 End) Over (Group By account_user.id) as total count

这只是对日期范围内的记录进行计数,并进行所需的操作。

编辑:我的答案与没有名字的马提交的答案相同

两个答案,一个是字面上的,只是解决你提出的问题,另一个是问你所要求的是否真的是你想要的

简单回答:修改所需的查询,将用户id添加到Select中,并从Where子句中删除用户id。现在您有了一个表,该表可以与较大查询的其余部分保持连接

...
Left Join (Select user_id, count(*) as total_count
                   From account_subscriptiongroup
                   Where account_subscriptiongroups.active = true
                   Group By user_id) Z
    On Z.user_id=account_user.id
我怀疑这个数字是否是你真正想要的。这将统计所有时间的每个帐户\ U subscriptiongroup条目,但仅统计活动的条目。你的大方巾 ry会返回非活动记录和活动记录,因此,如果您的目标是为某个百分比创建分母,那么您在这里混合了“苹果和橙子”

若您决定取而代之的是查询中记录的用户总数,那个么您可以向更大的查询中再添加一个元素,而无需再添加任何表。使用如下窗口功能:

Select ..., Sum(Case When account_subscriptiongroup.active Then 1 else 0 End) Over (Group By account_user.id) as total count
这只是统计日期范围内的记录,并具有所需的操作