LEFT OUTER JOIN 无法对列进行分组并且 returns 重复
LEFT OUTER JOIN cant group column and returns duplicates
我已经简化了我的问题并整理了示例。抱歉造成混淆。
我有两个table
kpi_index 和 audit_results
kpi_index 包含子类别 'C1' 的 8 个独特的 sor_code
audit_results 包含带有审计的记录
kpi_index 通过 INDEX 字段连接到 sor_code kpi_index 字段
我需要结果显示 'All' 8 sor_codes 和审核次数、符合的审核和通过百分比,根据 sor_code,但是,如果没有任何 sor_code 的结果对 sor_code.
显示 NULL 或“0”
我想到了这个查询,但出于某种原因,如果找到结果,即 audit_results 中的值,我会得到重复的 sor_codes,例如C1.TAM 和 C1.TOM 值是从 audit_results table 返回的,因此我不需要显示 kpi_index 匹配 sor_code/record 的空值。
我的目标是显示 kpi_index 中所有可用的 sor_code 并填充那些 sor_code 在加入的 audit_results table 并用填充的 'audited/complied/percentage' 值替换匹配的空行 - 如果在 audit_results 中找到匹配的 sor_code,则不应有空值的重复 sor_code。
谢谢
sor_code Spec. Code audits complied percentage contractor
C1.SNM C1 0 null null null
C1.SSM C1 0 null null null
C1.TAM C1 0 null null null
C1.TAM C1 186 151 81% South
C1.TIM C1 0 null null null
C1.TNM C1 0 null null null
C1.TOM C1 0 null null null
C1.TOM C1 41 40 98% South
SELECT DISTINCT
kpi_index.sor_code,
kpi_index.`Spec. Code`,
COUNT(audit_results.compliance) AS audits,
SUM(audit_results.compliance) AS complied,
CONCAT(ROUND(SUM(audit_results.compliance) / COUNT(kpi_index.sor_code) * 100, 0), '%') AS percentage,
audit_results.contractor
FROM kpi_index
LEFT OUTER JOIN audit_results
ON kpi_index.`INDEX` = audit_results.kpi_index
WHERE audit_results.contractor = 'South'
OR auit_results.contractor IS NULL
GROUP BY kpi_index.sor_code,
audit_results.contractor
HAVING kpi_index.`Spec. Code` = 'C1'
ORDER BY kpi_index.sor_code
SELECT
kpi_index.sor_code,
min(kpi_index.`Spec. Code`) AS spec_code,
COUNT(audit_results.compliance) AS audits,
SUM(audit_results.compliance) AS complied,
CONCAT(ROUND(
SUM(audit_results.compliance) * 100.00
/ COUNT(kpi_index.sor_code),
0), '%') AS percentage,
MIN(audit_results.contractor) AS contractor
FROM
kpi_index
LEFT OUTER JOIN audit_results
ON kpi_index.`INDEX` = audit_results.kpi_index
AND audit_results.contractor = 'South'
WHERE kpi_index.`Spec. Code` = 'C1'
GROUP BY kpi_index.sor_code
ORDER BY kpi_index.sor_code
DISTINCT
没有必要。当您包括所有 GROUP BY
列时,结果已经不同。
您遇到的主要问题是尝试过滤
您只加入 contractor = 'South'
的行。当你使用一个
外连接你必须小心 WHERE
子句条件
因为连接在逻辑上首先完成,然后才应用条件。当您的连接仅匹配不同名称的承包商时,您的 none 行匹配 is null
或 = 'South'
测试。
HAVING
中的条件确实属于WHERE
条款。尽管 MySQL 严格意义上讲它实际上没有意义
似乎接受了。
我删除了 contractor
上的额外分组,更喜欢使用
MIN()
在 SELECT
列表中。最终应该是
如果我认为 contractor
不可为空是多余的
正确。
我已经简化了我的问题并整理了示例。抱歉造成混淆。
我有两个table
kpi_index 和 audit_results
kpi_index 包含子类别 'C1' 的 8 个独特的 sor_code audit_results 包含带有审计的记录 kpi_index 通过 INDEX 字段连接到 sor_code kpi_index 字段
我需要结果显示 'All' 8 sor_codes 和审核次数、符合的审核和通过百分比,根据 sor_code,但是,如果没有任何 sor_code 的结果对 sor_code.
显示 NULL 或“0”我想到了这个查询,但出于某种原因,如果找到结果,即 audit_results 中的值,我会得到重复的 sor_codes,例如C1.TAM 和 C1.TOM 值是从 audit_results table 返回的,因此我不需要显示 kpi_index 匹配 sor_code/record 的空值。
我的目标是显示 kpi_index 中所有可用的 sor_code 并填充那些 sor_code 在加入的 audit_results table 并用填充的 'audited/complied/percentage' 值替换匹配的空行 - 如果在 audit_results 中找到匹配的 sor_code,则不应有空值的重复 sor_code。
谢谢
sor_code Spec. Code audits complied percentage contractor
C1.SNM C1 0 null null null
C1.SSM C1 0 null null null
C1.TAM C1 0 null null null
C1.TAM C1 186 151 81% South
C1.TIM C1 0 null null null
C1.TNM C1 0 null null null
C1.TOM C1 0 null null null
C1.TOM C1 41 40 98% South
SELECT DISTINCT
kpi_index.sor_code,
kpi_index.`Spec. Code`,
COUNT(audit_results.compliance) AS audits,
SUM(audit_results.compliance) AS complied,
CONCAT(ROUND(SUM(audit_results.compliance) / COUNT(kpi_index.sor_code) * 100, 0), '%') AS percentage,
audit_results.contractor
FROM kpi_index
LEFT OUTER JOIN audit_results
ON kpi_index.`INDEX` = audit_results.kpi_index
WHERE audit_results.contractor = 'South'
OR auit_results.contractor IS NULL
GROUP BY kpi_index.sor_code,
audit_results.contractor
HAVING kpi_index.`Spec. Code` = 'C1'
ORDER BY kpi_index.sor_code
SELECT
kpi_index.sor_code,
min(kpi_index.`Spec. Code`) AS spec_code,
COUNT(audit_results.compliance) AS audits,
SUM(audit_results.compliance) AS complied,
CONCAT(ROUND(
SUM(audit_results.compliance) * 100.00
/ COUNT(kpi_index.sor_code),
0), '%') AS percentage,
MIN(audit_results.contractor) AS contractor
FROM
kpi_index
LEFT OUTER JOIN audit_results
ON kpi_index.`INDEX` = audit_results.kpi_index
AND audit_results.contractor = 'South'
WHERE kpi_index.`Spec. Code` = 'C1'
GROUP BY kpi_index.sor_code
ORDER BY kpi_index.sor_code
DISTINCT
没有必要。当您包括所有GROUP BY
列时,结果已经不同。您遇到的主要问题是尝试过滤 您只加入
contractor = 'South'
的行。当你使用一个 外连接你必须小心WHERE
子句条件 因为连接在逻辑上首先完成,然后才应用条件。当您的连接仅匹配不同名称的承包商时,您的 none 行匹配is null
或= 'South'
测试。HAVING
中的条件确实属于WHERE
条款。尽管 MySQL 严格意义上讲它实际上没有意义 似乎接受了。我删除了
contractor
上的额外分组,更喜欢使用MIN()
在SELECT
列表中。最终应该是 如果我认为contractor
不可为空是多余的 正确。