繁体   English   中英

如何根据两个不同的标准计算不同的值?

[英]How To Count Distinct Values Based on Two Different Criteria?

我想从一列中区分,但有两个不同的标准。

我想在 count_1 上过滤所有 email 不包含 yopmail 并在count_1上过滤所有 email 不包含count_2

我试过这个 SQL 但我不知道如何过滤count_2 我的代码同时过滤了count_1count_2

SELECT "School"."name" AS "School", count(distinct "public"."users"."id") AS "count_1", count(distinct "public"."users"."id") AS "count_2"
FROM "public"."users"
LEFT JOIN "public"."user_roles" "User Roles" ON "public"."users"."id" = "User Roles"."user_id"
LEFT JOIN "public"."roles" "Role" ON "User Roles"."role_id" = "Role"."id"
LEFT JOIN "public"."schools" "School" ON "User Roles"."school_id" = "School"."id"
WHERE ("Role"."name" = 'Student'
   AND "public"."users"."deleted_at" IS NULL
   AND "public"."users"."activated_at" IS NOT NULL
   AND NOT (lower("public"."users"."email") like '%yopmail%'))
GROUP BY "School"."name"
ORDER BY "School"."name" ASC

结果是这样的:它同时过滤了count但我想从count_1count_2中获得不同的值。

 School      | Count_1   | Count_2   |
+------------+-----------+-----------+
| A          | 11        | 11        | 
| B          | 20        | 20        |
| C          | 34        | 34        |
+------------+-----------+-----------+

您可以通过过滤聚合来实现:

SELECT "School"."name" AS "School", 
        count(distinct "public"."users"."id") AS "count_1", 
        -- the following only counts users where the email column does not contain the value gmail
        count(distinct users.id) filter (where email not like '%gmail%') AS "count_2" 
FROM "public"."users"
LEFT JOIN "public"."user_roles" "User Roles" ON "public"."users"."id" = "User Roles"."user_id"
LEFT JOIN "public"."roles" "Role" ON "User Roles"."role_id" = "Role"."id"
LEFT JOIN "public"."schools" "School" ON "User Roles"."school_id" = "School"."id"
WHERE ("Role"."name" = 'Student'
   AND "public"."users"."deleted_at" IS NULL
   AND "public"."users"."activated_at" IS NOT NULL
   AND NOT (lower("public"."users"."email") like '%yopmail%'))
GROUP BY "School"."name"
ORDER BY "School"."name" ASC

经典的方法是使用 CASE 表达式。

SELECT "School"."name" AS "School",
count(distinct CASE WHEN NOT (lower("public"."users"."email") like '%yopmail%') THEN "public"."users"."id" else NULL END) AS "count_1",
count(distinct CASE WHEN NOT (lower("public"."users"."email") like '%gmail%') THEN "public"."users"."id" else NULL END) AS "count_2"
FROM "public"."users"
LEFT JOIN "public"."user_roles" "User Roles" ON "public"."users"."id" = "User Roles"."user_id"
LEFT JOIN "public"."roles" "Role" ON "User Roles"."role_id" = "Role"."id"
LEFT JOIN "public"."schools" "School" ON "User Roles"."school_id" = "School"."id"
WHERE ("Role"."name" = 'Student'
   AND "public"."users"."deleted_at" IS NULL
   AND "public"."users"."activated_at" IS NOT NULL)
GROUP BY "School"."name"
ORDER BY "School"."name" ASC

如果您使用过滤子句,请将其应用于 count_1 和 count_2,并从 WHERE 子句中删除 email 条件。

SELECT "School"."name" AS "School",
count(distinct "public"."users"."id") filter (where NOT (lower("public"."users"."email") like '%yopmail%')) AS "count_1",
count(distinct "public"."users"."id") filter (where NOT (lower("public"."users"."email") like '%gmail%')) AS "count_2"
FROM "public"."users"
LEFT JOIN "public"."user_roles" "User Roles" ON "public"."users"."id" = "User Roles"."user_id"
LEFT JOIN "public"."roles" "Role" ON "User Roles"."role_id" = "Role"."id"
LEFT JOIN "public"."schools" "School" ON "User Roles"."school_id" = "School"."id"
WHERE ("Role"."name" = 'Student'
   AND "public"."users"."deleted_at" IS NULL
   AND "public"."users"."activated_at" IS NOT NULL)
GROUP BY "School"."name"
ORDER BY "School"."name" ASC

见下文: SQL 小提琴

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM