SQL Server TSQL上的双重计数结果

wztqucjr  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(148)

我使用下面的查询来计算所有脚本的运行次数,但是当一个软件有两种类型(pacote列)时,它会使计算结果加倍。

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部分,它会返回所需的计数值。

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 ║
╚══════════╩═══════════════╩═══════════╝

以下是与此查询相关的表中的一些附加信息:
数据来自于基础克里思_媒体_执行:

╔══════════╦═══════════════╦═══════════════╗
║ 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个条目。3个来自Desinstalação,9个来自Instalação。
由于某种原因,当使用count produto而不使用INNER JOIN函数时,它将返回正确的计数。但当使用它时,它将使结果加倍。
我已经问过这个问题了,但是格式和信息质量很差。因此,它无法回答。然后这个问题被创建了更好的解释,数据,格式,使它在几分钟内得到回答。
提前谢谢大家。

to94eoyn

to94eoyn1#

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

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

如果不满足此条件,则每一行都将乘以克里思_medio_execucao表格中的 both 行,从而创建副本。

相关问题