即使没有求和结果,如何显示mySQL行?
我正在尝试显示来自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
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