Mysql 如何使用2个表创建具有2个计数的分组依据?
如果我能在这里得到一些建议,那就太好了。我正在尝试使用两个表中的信息创建一个具有两个不同计数的分组。我成功地创建了一个组,它只有我想要的两个计数中的一个,但是被卡住了。谢谢你的帮助Mysql 如何使用2个表创建具有2个计数的分组依据?,mysql,sql,postgresql,Mysql,Sql,Postgresql,如果我能在这里得到一些建议,那就太好了。我正在尝试使用两个表中的信息创建一个具有两个不同计数的分组。我成功地创建了一个组,它只有我想要的两个计数中的一个,但是被卡住了。谢谢你的帮助 Table_1 ID | Date | Error_code 101| 01/11/19 | A 102| 01/11/19 | B 103| 02/11/19 | A 104| 03/11/19 | A Table_2 ID | Status_code 101| 1 102| 2 10
Table_1
ID | Date | Error_code
101| 01/11/19 | A
102| 01/11/19 | B
103| 02/11/19 | A
104| 03/11/19 | A
Table_2
ID | Status_code
101| 1
102| 2
103| 1
104| 1
最终,我试图实现这个特殊的结果:date | error_code | count_status_code_1 | count_status_code_2
01/11/19 | A | 1 | 1
02/11/19 | A | 0 | 0
03/11/19 | A | 1 | 0
以下是我到目前为止得到的信息:
选择日期,
错误代码,
计数(*)为计数\状态\代码\ 1
来自表1
联接表2
在表_1.id上=表_2.id
其中错误代码='A'
和状态_代码=1
按日期分组,
错误代码
按日期订购ASC;
我应该如何修改代码以添加第二个计数列
提前谢谢 使用条件聚合:
select date, error_code,
sum(case when Status_code =1 then 1 else 0 end) as count_status_code_1,
sum(case when Status_code =2 then 1 else 0 end) as count_status_code_2
from table_1 t1
join table_2 t2
on t1.id = t2.id
where error_code = 'A'
group by date, error_code
order by date;
基于您想要的结果,而不是启动的SQL。所需的结果集必须不显示“B”错误代码,但仍会记录其链接状态代码的结果。为了做到这一点,我们需要决定如何只显示错误代码“a”,但仍然统计与错误代码“B”相关的状态代码。为了只显示“A”,我决定获取错误代码的第一个值,按日期分组,然后按错误代码排序。我也可以按状态ID排序。最后,将两个状态代码列相加。不要过滤掉“B”或状态代码,因为您将无法获得计数
SELECT
DATE
,Ecode Error_code
,SUM(count_status_code_1) count_status_code_1
,SUM(count_status_code_2) count_status_code_2
FROM
(
SELECT
Date
,FIRST_VALUE(Error_code) OVER (PARTITION BY Date ORDER BY Error_code) ECode
,CASE WHEN Status_code = 1 THEN 1 ELSE 0 END count_status_code_1
,CASE WHEN Status_code = 2 THEN 1 ELSE 0 END count_status_code_2
FROM
Table1
JOIN
Table2 ON Table2.ID = Table1.ID
) Error_Table
GROUP BY
Date, Error_code
ORDER BY Date
我敦促您重新考虑所需的结果,以便错误代码列n显示两个错误“A,B”。下面是如何做到这一点的
PostgreSQL
SELECT
Date
,string_agg(Error_code, ',') Error_code
,SUM(CASE WHEN Status_code = 1 THEN 1 ELSE 0 END) count_status_code_1
,SUM(CASE WHEN Status_code = 2 THEN 1 ELSE 0 END) count_status_code_2
FROM
Table1
JOIN
Table2 ON Table2.ID = Table1.ID
GROUP BY
Date
ORDER BY Date
SELECT
Date
,group_concat(Error_code) Error_code
,SUM(CASE WHEN Status_code = 1 THEN 1 ELSE 0 END) count_status_code_1
,SUM(CASE WHEN Status_code = 2 THEN 1 ELSE 0 END) count_status_code_2
FROM
Table1
JOIN
Table2 ON Table2.ID = Table1.ID
GROUP BY
Date
ORDER BY Date
这是你的生活方式
MySQL
SELECT
Date
,string_agg(Error_code, ',') Error_code
,SUM(CASE WHEN Status_code = 1 THEN 1 ELSE 0 END) count_status_code_1
,SUM(CASE WHEN Status_code = 2 THEN 1 ELSE 0 END) count_status_code_2
FROM
Table1
JOIN
Table2 ON Table2.ID = Table1.ID
GROUP BY
Date
ORDER BY Date
SELECT
Date
,group_concat(Error_code) Error_code
,SUM(CASE WHEN Status_code = 1 THEN 1 ELSE 0 END) count_status_code_1
,SUM(CASE WHEN Status_code = 2 THEN 1 ELSE 0 END) count_status_code_2
FROM
Table1
JOIN
Table2 ON Table2.ID = Table1.ID
GROUP BY
Date
ORDER BY Date
MySQL还是PostGreSQL?他们是不同的产品。顺便说一句,你确定结果吗?谢谢你的回答!我的问题不好,但我特别使用postgresql来进行此查询。然而,我也在尝试学习MySQL,所以我想看看它在这个特定的系统中会有多大的不同会很好well@Jeremy,根据您的数据,您的where子句将永远不会计算count\U status\U code\U 2。根据你想要的结果,我下面的答案应该能让你明白。我想,如果可能的话,重新考虑一下你想要的结果集。例如,错误代码上的字符串_agg将生成A、B,您所需的结果集将更有意义。您可能希望使用
sum
而不是count
+,您应该能够执行sum(status_code=1)和sum(status_code=2)。此查询将过滤掉status_code 2,其中error_code='A',因为状态_code 2是error_code B某些规则因DBMS方言而异。你不能在PostGreSQL@gosfly上应用你的,没错,如果这是MySQL,这就可以了。目前,我们仍然不知道他使用的是哪种DBMS。