TSQL上的重复计算结果

时间:2018-11-12 12:45:56

标签: sql-server tsql

我正在使用以下查询来统计所有脚本的运行,但是当一种软件有两种类型时(“批注”列),它会使计数结果加倍。

SELECT  
     p.produto, p.pacote, COUNT(p.produto) AS Execuções, t.tempo_minutos AS [Tempo Médio (Manual)]
FROM 
     [log].pdq AS p 
INNER JOIN 
     infra.tempo_medio_execucao AS t ON t.produto = p.produto
WHERE 
     (p.status IS NOT NULL) AND (p.status = 'Sucesso') AND (p.produto = 'SafeSign')
GROUP BY 
      p.produto, p.pacote, t.tempo_minutos

此查询返回以下结果:

╔══════════╦═══════════════╦═══════════╦══════════════════════╗
║ produto  ║    pacote     ║ Execuções ║ Tempo Médio (Manual) ║
╠══════════╬═══════════════╬═══════════╬══════════════════════╣
║ SafeSign ║ Desinstalação ║         6 ║                   20 ║
║ SafeSign ║ Instalação    ║        18 ║                   20 ║
╚══════════╩═══════════════╩═══════════╩══════════════════════╝

但是,如果我删除了代码的INNER JOIN部分,它将返回所需的计数值。但是我的查询需要一个带有infra.tempo_medio_execucao表的INNER JOIN。

SELECT  
     p.produto, p.pacote, COUNT(p.produto) AS Execuções
FROM 
     [log].pdq AS p 
WHERE 
     (p.status IS NOT NULL) AND (p.status = 'Sucesso') AND (p.produto = 'SafeSign')
GROUP BY 
      p.produto, p.pacote

此新查询将产生以下结果(这是执行INNER JOIN查询时的预期结果):

╔══════════╦═══════════════╦═══════════╗
║ produto  ║    pacote     ║ Execuções ║
╠══════════╬═══════════════╬═══════════╣
║ SafeSign ║ Desinstalação ║         3 ║
║ SafeSign ║ Instalação    ║         9 ║
╚══════════╩═══════════════╩═══════════╝

以下是与此查询相关的表中的一些其他信息:

来自infra.tempo_medio_execucao的数据:

╔══════════╦═══════════════╦═══════════════╗
║ produto  ║    pacote     ║ tempo_minutos ║
╠══════════╬═══════════════╬═══════════════╣
║ SafeSign ║ Instalação    ║            20 ║
║ SafeSign ║ Desinstalação ║            20 ║
╚══════════╩═══════════════╩═══════════════╝

log.pdq中的数据:

╔══════════╦═══════════════╦═════════════════════════╦═════════════════════════╦══════════════════╦═════════╗
║ produto  ║    pacote     ║         inicio          ║           fim           ║     duracao      ║ status  ║
╠══════════╬═══════════════╬═════════════════════════╬═════════════════════════╬══════════════════╬═════════╣
║ SafeSign ║ Instalação    ║ 2018-11-09 13:06:00.000 ║ 2018-11-09 13:07:29.000 ║ 00:01:28.0000000 ║ Sucesso ║
║ SafeSign ║ Desinstalação ║ 2018-11-09 13:21:19.000 ║ 2018-11-09 13:21:20.000 ║ 00:00:00.0000000 ║ Sucesso ║
║ SafeSign ║ Instalação    ║ 2018-11-09 13:27:52.000 ║ 2018-11-09 13:28:55.000 ║ 00:01:03.0000000 ║ Sucesso ║
║ SafeSign ║ Instalação    ║ 2018-11-09 13:34:08.000 ║ 2018-11-09 13:34:58.000 ║ 00:00:50.0000000 ║ Sucesso ║
║ SafeSign ║ Desinstalação ║ 2018-11-09 13:38:19.000 ║ 2018-11-09 13:38:19.000 ║ 00:00:00.0000000 ║ Sucesso ║
║ SafeSign ║ Desinstalação ║ 2018-11-09 14:04:34.000 ║ 2018-11-09 14:04:35.000 ║ 00:00:00.0000000 ║ Sucesso ║
║ SafeSign ║ Instalação    ║ 2018-11-09 14:09:41.000 ║ 2018-11-09 14:10:15.000 ║ 00:00:33.0000000 ║ Sucesso ║
║ SafeSign ║ Instalação    ║ 2018-11-09 14:09:57.000 ║ 2018-11-09 14:11:49.000 ║ 00:01:52.0000000 ║ Sucesso ║
║ SafeSign ║ Instalação    ║ 2018-11-09 13:17:01.000 ║ 2018-11-09 13:19:37.000 ║ 00:02:36.0000000 ║ Sucesso ║
║ SafeSign ║ Instalação    ║ 2018-11-09 13:17:01.000 ║ 2018-11-09 13:17:44.000 ║ 00:00:42.0000000 ║ Sucesso ║
║ SafeSign ║ Instalação    ║ 2018-11-09 14:28:16.000 ║ 2018-11-09 14:30:32.000 ║ 00:02:15.0000000 ║ Sucesso ║
║ SafeSign ║ Instalação    ║ 2018-11-09 15:30:34.000 ║ 2018-11-09 15:31:06.000 ║ 00:00:32.0000000 ║ Sucesso ║
╚══════════╩═══════════════╩═════════════════════════╩═════════════════════════╩══════════════════╩═════════╝

根据log.pdq表,有12个条目。 Desinstalação中有3位,Instalação中有9位。

由于某些原因,当使用计数产品而不使用INNER JOIN函数时,它将返回正确的计数。但是当使用它时,它将使结果加倍。

我已经问过这个问题,但是格式和信息质量很差。因此,无法回答。然后,随着更好的解释,数据,格式的出现,这个问题在几分钟之内就浮出水面。

首先感谢所有。

1 个答案:

答案 0 :(得分:2)

您可能需要在pacote条件中包含JOIN字段:

infra.tempo_medio_execucao AS t ON t.produto = p.produto AND t.pacote = p.pacote

在没有这种条件的情况下,每行都与tempo_medio_execucao表中的两行相乘,从而创建重复行。