Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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行?_Mysql_Sql - Fatal编程技术网

即使没有求和结果,如何显示mySQL行?

即使没有求和结果,如何显示mySQL行?,mysql,sql,Mysql,Sql,我正在尝试显示来自mySQL的报告。以下是我当前的查询: SELECT *, Sum(CASE WHEN alerts_data_status = 'goal' THEN 1 ELSE 0 END) AS goal, Sum(CASE WHEN alerts_data_status = 'delivered' THEN 1 ELSE

我正在尝试显示来自mySQL的报告。以下是我当前的查询:

SELECT *,
       Sum(CASE 
             WHEN alerts_data_status = 'goal' THEN 1 
             ELSE 0 
           END) AS goal, 
       Sum(CASE 
             WHEN alerts_data_status = 'delivered' THEN 1 
             ELSE 0 
           END) AS delivered, 
       Sum(CASE 
             WHEN alerts_data_status = 'closed' THEN 1 
             ELSE 0 
           END) AS closed
FROM   alerts_data 
WHERE  alerts_data.company_id = 1
GROUP  BY alerts_data.alerts_data_id 
问题是,如果一个alerts_data.id有0个目标、0个已交付、0个已关闭,它将不会显示在结果中。查询仅显示至少有1个目标、1个已交付或1个已关闭的警报\u data.id

我怎样才能做到这一点

示例输出

company ---- id --- goal --- delivered --- closed
1 ---- 32 --- 1 ------ 4 ----- 10
1 ---- 11 --- 0 ------ 1 ----- 1

谢谢你

我想你遇到的问题是表格中没有公司的行。使用没有分组依据的聚合查询:

这不是GROUPBY,它保证返回一行—即使WHERE子句过滤掉所有行。GROUP BY每个组返回一行,因此如果过滤掉所有行,则结果集中没有组,也没有行

如果要支持多个公司ID,可以使用左连接:

左连接保证每个公司都有行,因此每个公司都将在结果集中

您也可以将其表述为:

这不是GROUPBY,它保证返回一行—即使WHERE子句过滤掉所有行。GROUP BY每个组返回一行,因此如果过滤掉所有行,则结果集中没有组,也没有行

如果要支持多个公司ID,可以使用左连接:

您需要警报\u列表的左连接来连接警报\u数据:


是否有包含所有警报\u数据\u ID的表?@forpas是,警报\u列表表。在“警报数据”表中,如果警报数据id没有目标、未交付、未关闭,则没有用于确切警报数据id的行。请参阅我编辑的答案。您好。谢谢你的回答。确切地说,问题是警报数据没有用于确切公司和确切警报的行。我刚刚编辑了我的输出,以使其更清晰。我已经按照你的第一个建议编辑了我的问题,但没有任何运气。我想我编辑的输出现在更切题了。谢谢,但是当alerts_数据表中没有特定id的行时会发生什么呢。我的意思是,警报列表中的id条目在那里,但这并不一定意味着警报数据中也有该id的条目。使用左连接,您将为警报列表的每个id获得一行,即使警报数据中不存在该id。我理解。输出查询现在显示那些没有任何目标、已交付、已关闭的结果,但它不仅显示company_id=1结果。它也显示了其他公司的情况,在“选择警报”\u data.company\u idI”处有一个空值。我正在努力实现这一点:从警报列表左侧加入警报数据,在警报数据上加入警报数据。警报数据\u id=警报列表。警报id和警报数据。公司id=警报列表。公司id=1ok,但是使用上面的答案,它在company\u id列中将来自其他公司的所有其他t.alerts\u id显示为NULL
SELECT 1 as company_id,
       COALESCE(SUM(alerts_data_status = 'goal'), 0) AS goal, 
       COALESCE(SUM(alerts_data_status = 'delivered'), 0) AS delivered, 
       COALESCE(SUM(alerts_data_status = 'closed'), 0) AS closed
FROM alerts_data ad
WHERE ad.company_id = 1;
SELECT company_id,
       COALESCE(SUM(alerts_data_status = 'goal'), 0) AS goal, 
       COALESCE(SUM(alerts_data_status = 'delivered'), 0) AS delivered, 
       COALESCE(SUM(alerts_data_status = 'closed'), 0) AS closed
FROM (SELECT 1 as company_id UNION ALL
      SELECT 2 as company_id
     ) c LEFT JOIN
     alerts_data ad
     USING (company_id)
GROUP BY company_id;
SELECT 1 as company_id,
       COALESCE(SUM(alerts_data_status = 'goal'), 0) AS goal, 
       COALESCE(SUM(alerts_data_status = 'delivered'), 0) AS delivered, 
       COALESCE(SUM(alerts_data_status = 'closed'), 0) AS closed
FROM alerts_data ad
WHERE ad.company_id = 1;
SELECT c.company_id,
       COALESCE(SUM(ad.alerts_data_status = 'goal'), 0) AS goal, 
       COALESCE(SUM(ad.alerts_data_status = 'delivered'), 0) AS delivered, 
       COALESCE(SUM(ad.alerts_data_status = 'closed'), 0) AS closed
FROM companies c LEFT JOIN
     alerts_data ad
     on c.company_id = ad.company_id
WHERE c.company_id IN (1)   -- or a longer list
GROUP BY c.company_id;
SELECT t.alerts_id,
  SUM(a.alerts_data_status = 'goal') AS goal, 
  SUM(a.alerts_data_status = 'delivered') AS delivered, 
  SUM(a.alerts_data_status = 'closed') AS closed
FROM alerts_list AS t LEFT JOIN alerts_data AS a 
ON a.alerts_data_id = t.alerts_id AND a.company_id = t.company_id 
WHERE t.company_id = 1
GROUP BY t.alerts_data_id