Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用2个表创建具有2个计数的分组依据?_Mysql_Sql_Postgresql - Fatal编程技术网

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。