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
  1. DISTINCT 没有必要。当您包括所有 GROUP BY 列时,结果已经不同。

  2. 您遇到的主要问题是尝试过滤 您只加入 contractor = 'South' 的行。当你使用一个 外连接你必须小心 WHERE 子句条件 因为连接在逻辑上首先完成,然后才应用条件。当您的连接仅匹配不同名称的承包商时,您的 none 行匹配 is null= 'South' 测试。

  3. HAVING中的条件确实属于WHERE 条款。尽管 MySQL 严格意义上讲它实际上没有意义 似乎接受了。

  4. 我删除了 contractor 上的额外分组,更喜欢使用 MIN()SELECT 列表中。最终应该是 如果我认为 contractor 不可为空是多余的 正确。