从联合表

时间:2015-12-11 12:18:05

标签: mysql database

这是我的问题:我需要获得与满足特定条件的项目相关的测试用例和问题的数量(成功的测试用例以及应用程序存在缺陷的问题),但由于某种原因,数量不足加起来。我在一个项目中有10个测试用例,其中6个是成功的;和8个问题,其中只有4个是缺陷。但是,每个COUNT的相应结果都显示24,这没有任何意义。我注意到,24恰好是6次4,但我不知道查询会如何乘以它们。

无论如何......有人可以帮我找到我的查询的哪一部分是错的吗?我怎样才能得到正确的结果?提前谢谢。

以下是查询:

SELECT
    p.codigo_proyecto,
    p.nombre,
    IFNULL(COUNT(iep.id_incidencia_etapa_proyecto), 0) AS cantidad_defectos,
    IFNULL(COUNT(tc.id_test_case), 0) AS test_cases_exitosos,
    CASE IFNULL(COUNT(tc.id_test_case), 0) WHEN 0 THEN 'No aplica'
    ELSE CONCAT((IFNULL(COUNT(tc.id_test_case), 0) / IFNULL(COUNT(tc.id_test_case), 0)) * 100, '%') END AS tasa_defectos
FROM proyecto p
INNER JOIN etapa_proyecto ep ON p.codigo_proyecto = ep.codigo_proyecto
INNER JOIN incidencia_etapa_proyecto iep ON ep.id_etapa_proyecto = iep.id_etapa_proyecto
INNER JOIN incidencia i ON iep.id_incidencia = i.id_incidencia
INNER JOIN test_case tc ON ep.id_etapa_proyecto = tc.id_etapa_proyecto
INNER JOIN etapa_proyecto ep_ultima ON ep_ultima.id_etapa_proyecto =
    (SELECT ep_ultima2.id_etapa_proyecto FROM etapa_proyecto ep_ultima2
    WHERE p.codigo_proyecto = ep_ultima2.codigo_proyecto ORDER BY ep_ultima2.fecha_termino_real DESC LIMIT 1)
WHERE p.esta_cerrado = 1
AND i.es_defecto = 1
AND tc.resultado = 'Exitoso'
AND ep_ultima.fecha_termino_real BETWEEN '2015-01-01' AND '2016-12-31';

1 个答案:

答案 0 :(得分:0)

我会认为很明显,如果没有GROUP BY,你不会从聚合查询得到预期的输出(这表明你实际上无法有效地评估这里给出的任何建议)。

你没有说过你的数据状态是如何在数据库中表示的 - 所以我不得不根据SQL做出很多猜测,这显然是非常错误的。而且我不会说西班牙语/葡萄牙语或任何你的母语。

如果缺陷表的主键为空,则表示您推断存在缺陷。主键不能为空。这会产生任何意义的唯一方法(BTW它仍然不会给你你正在寻找的答案)是做LEFT JOIN而不是INNER JOIN。

但即使这样,一个简单的COUNT()也会将null case(源表中没有记录)视为输出集中的1条记录。

然后你遇到的问题是你的输出中会有缺陷和测试用例的产物 - 考虑你没有缺陷的情况,但是2个测试用例(1,2) - 外部结果的结果将是:

defect   test
------   ----
null     1
null     2

如果您只计算行数,则输出中会出现2个缺陷。

采用更简单的模式,这演示了获取值的两种方法 - 请注意它们具有非常不同的性能特征。

SELECT project.id
, dilv.defects
, (SELECT COUNT(*) 
    FROM test_cases) AS tests
FROM project
LEFT JOIN ( SELECT project_id, COUNT(*) AS defects
    FROM defect_table
    GROUP BY project_id) AS dilv
ON project.id=dilv.project_id