Return 基于两个条件的每个唯一 ID 的不同值的多个 COUNT 字段
Return multiple COUNT fields for distinct values per a unique ID based on two criteria conditions
我正在尝试使用 MySQL 中的一些日志记录数据,我希望能够在其中告诉每个人不同的成功请求、不同的不成功请求、非不同的成功请求的计数请求,以及所有满足额外全局标准的不明确的不成功请求。
这是代表原始 table 的虚构数据示例:
+--------------+--------+---------------+----------+------+
| request_date | client | request | response | site |
+--------------+--------+---------------+----------+------+
| 10/30/2018 | Amy | RE_food | 200 | MD |
| 10/30/2018 | Amy | RE_food | 200 | MD |
| 10/30/2018 | Amy | RE_transport | 200 | MD |
| 10/30/2018 | Amy | RE_assistance | 404 | MD |
| 10/30/2018 | Amy | OA_assistance | 404 | MD |
| 10/30/2018 | Bob | RE_food | 200 | MD |
| 10/30/2018 | Dan | RE_food | 404 | MD |
| 10/30/2018 | Dan | RE_food | 404 | SE |
| 10/30/2018 | Mike | RE_transport | 200 | SE |
| 10/30/2018 | Sally | RE_food | 404 | SE |
| 10/30/2018 | Sally | OA_food | 404 | MD |
| 10/30/2018 | Zeb | RE_assistance | 404 | MD |
| 10/30/2018 | Zeb | OA_assistance | 404 | MD |
+--------------+--------+---------------+----------+------+
我想编写一个查询 return
+--------+-----------+------------+----------+-----------+
| client | unique_OK | unique_404 | total_OK | total_404 |
+--------+-----------+------------+----------+-----------+
其中唯一表示仅计算不同的客户端、请求、响应分组。它将 return 结果
+--------+-----------+------------+----------+-----------+
| client | unique_OK | unique_404 | total_OK | total_404 |
+--------+-----------+------------+----------+-----------+
| Amy | 2 | 1 | 3 | 1 |
| Bob | 1 | 0 | 1 | 0 |
| Dan | 0 | 1 | 0 | 1 |
| Mike | 0 | 0 | 0 | 0 |
| Sally | 0 | 0 | 0 | 0 |
| Zeb | 0 | 1 | 0 | 1 |
+--------+-----------+------------+----------+-----------+
(请注意,在上面显示的所有四个列中,为了清楚地说明该过程,我向客户显示了 0 个计数;如果他们不包含在响应中也没关系。)
我试过类似这样的查询但没有用,但希望它对我正在尝试做的事情有意义:
SELECT client AS person,
COUNT(DISTINCT request WHERE response = '200') AS unique_OK,
COUNT(DISTINCT request WHERE response = '404') AS unique_404
COUNT(WHERE response = '200') as total_OK,
COUNT(WHERE response = '404') as total_404
FROM transactions
WHERE request like '%RE%' and site = MD and DATE_FORMAT(request_date, '%Y%m%d')='20181030';
使用条件聚合:
select
client,
count(distinct case when response = 200 then request end) unique_ok,
count(distinct case when response = 404 then request end) unique_404,
sum(response = 200) total_ok,
sum(response = 404) total_404
from mytable
where
request like '%RE%'
and site = 'MD'
and request_date = '2018-10-30'
group by client
| client | unique_ok | unique_404 | total_ok | total_404 |
| ------ | --------- | ---------- | -------- | --------- |
| Amy | 2 | 1 | 3 | 1 |
| Bob | 1 | 0 | 1 | 0 |
| Dan | 0 | 1 | 0 | 1 |
| Zeb | 0 | 1 | 0 | 1 |
我正在尝试使用 MySQL 中的一些日志记录数据,我希望能够在其中告诉每个人不同的成功请求、不同的不成功请求、非不同的成功请求的计数请求,以及所有满足额外全局标准的不明确的不成功请求。
这是代表原始 table 的虚构数据示例:
+--------------+--------+---------------+----------+------+
| request_date | client | request | response | site |
+--------------+--------+---------------+----------+------+
| 10/30/2018 | Amy | RE_food | 200 | MD |
| 10/30/2018 | Amy | RE_food | 200 | MD |
| 10/30/2018 | Amy | RE_transport | 200 | MD |
| 10/30/2018 | Amy | RE_assistance | 404 | MD |
| 10/30/2018 | Amy | OA_assistance | 404 | MD |
| 10/30/2018 | Bob | RE_food | 200 | MD |
| 10/30/2018 | Dan | RE_food | 404 | MD |
| 10/30/2018 | Dan | RE_food | 404 | SE |
| 10/30/2018 | Mike | RE_transport | 200 | SE |
| 10/30/2018 | Sally | RE_food | 404 | SE |
| 10/30/2018 | Sally | OA_food | 404 | MD |
| 10/30/2018 | Zeb | RE_assistance | 404 | MD |
| 10/30/2018 | Zeb | OA_assistance | 404 | MD |
+--------------+--------+---------------+----------+------+
我想编写一个查询 return
+--------+-----------+------------+----------+-----------+
| client | unique_OK | unique_404 | total_OK | total_404 |
+--------+-----------+------------+----------+-----------+
其中唯一表示仅计算不同的客户端、请求、响应分组。它将 return 结果
+--------+-----------+------------+----------+-----------+
| client | unique_OK | unique_404 | total_OK | total_404 |
+--------+-----------+------------+----------+-----------+
| Amy | 2 | 1 | 3 | 1 |
| Bob | 1 | 0 | 1 | 0 |
| Dan | 0 | 1 | 0 | 1 |
| Mike | 0 | 0 | 0 | 0 |
| Sally | 0 | 0 | 0 | 0 |
| Zeb | 0 | 1 | 0 | 1 |
+--------+-----------+------------+----------+-----------+
(请注意,在上面显示的所有四个列中,为了清楚地说明该过程,我向客户显示了 0 个计数;如果他们不包含在响应中也没关系。)
我试过类似这样的查询但没有用,但希望它对我正在尝试做的事情有意义:
SELECT client AS person,
COUNT(DISTINCT request WHERE response = '200') AS unique_OK,
COUNT(DISTINCT request WHERE response = '404') AS unique_404
COUNT(WHERE response = '200') as total_OK,
COUNT(WHERE response = '404') as total_404
FROM transactions
WHERE request like '%RE%' and site = MD and DATE_FORMAT(request_date, '%Y%m%d')='20181030';
使用条件聚合:
select
client,
count(distinct case when response = 200 then request end) unique_ok,
count(distinct case when response = 404 then request end) unique_404,
sum(response = 200) total_ok,
sum(response = 404) total_404
from mytable
where
request like '%RE%'
and site = 'MD'
and request_date = '2018-10-30'
group by client
| client | unique_ok | unique_404 | total_ok | total_404 |
| ------ | --------- | ---------- | -------- | --------- |
| Amy | 2 | 1 | 3 | 1 |
| Bob | 1 | 0 | 1 | 0 |
| Dan | 0 | 1 | 0 | 1 |
| Zeb | 0 | 1 | 0 | 1 |