Double count result when using INNER JOIN on TSQL(在 TSQL 上使用 INNER JOIN 时的双计数结果)
问题描述
我正在使用以下查询来计算所有脚本运行的次数,但是当一个软件有 2 种类型时,它会将计数结果加倍.
I'm using the following query to count all scripts runs, but when there are 2 types for a software, it doubles the count result.
这是我正在使用的查询:
Here is query I'm using:
SELECT
p.produto, p.pacote,
COUNT(p.produto) AS Execuções,
CONVERT(VARCHAR, AVG(DATEDIFF(SECOND, p.inicio, p.fim)) / 60) + ':' + RIGHT('0' + CONVERT(VARCHAR, AVG(DATEDIFF(SECOND, p.inicio, p.fim)) % 60), 2) AS [Tempo Médio (Automatizado)],
t.tempo_minutos AS [Tempo Médio (Manual)],
CONVERT(VARCHAR, (t.tempo_minutos * 60 - AVG(DATEDIFF(SECOND, p.inicio, p.fim))) / 60) + ':' + RIGHT('0' + CONVERT(VARCHAR, (t.tempo_minutos * 60 - AVG(DATEDIFF(SECOND, p.inicio, p.fim))) % 60), 2) AS [Economia Média],
CONVERT(VARCHAR, (t.tempo_minutos * 60 - AVG(DATEDIFF(SECOND, p.inicio, p.fim))) * COUNT(p.produto) / 60) + ':' + RIGHT('0' + CONVERT(VARCHAR, (t.tempo_minutos * 60 - AVG(DATEDIFF(SECOND, p.inicio, p.fim))) * COUNT(p.produto) % 60), 2) AS [Economia Total]
FROM
[log].pdq AS p
INNER JOIN
infra.tempo_medio_execucao AS t ON t.produto = p.produto
WHERE
(p.equipamento NOT LIKE 'XXX%') AND (p.status = 'Sucesso')
GROUP BY
p.produto, p.pacote, t.tempo_minutos
此查询返回以下结果(从表中删除了不必要的信息):
This query is returning the following result (removed the unnecessary info from the table):
produto | pacote | Execuções
---------+---------------+-----------
SafeSign | Desinstalação | 6
SafeSign | Instalação | 18
ScanBack | Instalação | 128
它应该返回的地方:
produto | pacote | Execuções
---------+---------------+-----------
SafeSign | Desinstalação | 3
SafeSign | Instalação | 9
ScanBack | Instalação | 128
在 infra.tempo_medio_execucao 表中,我有这个数据:
In the infra.tempo_medio_execucao table, I have this data:
produto | pacote | tempo_minutos
-------------+---------------+--------------
ScanBack | Instalação | 20
Siric Zero | Instalação | 20
GRRF | Instalação | 90
SICCH | Instalação | 15
Outlook 2013 | Instalação | 25
7-Zip | Instalação | 20
7-Zip | Desinstalação | 20
SafeSign | Instalação | 20
SafeSign | Desinstalação | 20
表 log.pdq 将返回:
The table log.pdq will return:
id | produto | pacote | inicio | fim | duracao | status
---+-----------+-------------+-------------------------+-------------------------+------------------+--------
1 | ScanBack | Instalação | 2018-09-18 11:22:54.000 | 2018-09-18 11:27:43.000 | 00:04:49.0000000 | Sucesso
2 | ScanBack | Instalação | 2018-09-18 12:10:46.000 | 2018-09-18 12:11:04.000 | 00:00:17.0000000 | Sucesso
3 | ScanBack | Instalação | 2018-09-18 12:10:49.000 | 2018-09-18 12:11:17.000 | 00:00:27.0000000 | Sucesso
4 | GRRF | Instalação | 2018-09-18 12:28:43.000 | 2018-09-18 12:29:14.000 | 00:00:30.0000000 | Sucesso
我创建的视图返回:(但对于 Safesign,它应该返回 3 和 9,而不是 6 和 18)
And the view I've created returns: (but for Safesign, it should return 3 and 9, not 6 and 18)
Produto | Pacote | Execuções | Tempo Médio (Automatizado) | Tempo Médio (Manual) | Economia Média | Economia Total
-----------+---------------+------------+----------------------------+----------------------+-----------------+----------------
GRRF | Instalação | 1 | 0:31 | 90 | 89:29 | 89:29
SafeSign | Desinstalação | 6 | 0:00 | 20 | 20:00 | 120:00
SafeSign | Instalação | 18 | 1:19 | 20 | 18:41 | 336:18
ScanBack | Instalação | 128 | 1:23 | 20 | 18:37 | 2382:56
SICCH | Instalação | 7 | 0:34 | 15 | 14:26 | 101:02
Siric Zero | Instalação | 208 | 0:33 | 20 | 19:27 | 4045:36
提前致谢!
推荐答案
我怀疑这符合您在问题中指定的内容:
I suspect that this does what you specify in the question:
SELECT p.produto, p.pacote,
COUNT(DISTINCT p.produto) AS Execuções,
. . .
你会从你的连接中得到重复——基本上是意外的匹配.
You would be getting duplicates from your joins -- basically unexpected matches.
但是,其他列也很可能(很可能)不准确.如果这解决了 Execuções
的问题,但您仍然有其他问题,请询问另一个问题.非常清楚示例数据、预期结果以及需要修复的内容.
However, it is quite possible (likely) that other columns are also inaccurate. If this fixes the issue with Execuções
, but you still have other issues, then ask another question. Be very clear about sample data, desired results, and what needs to be fixed.
这篇关于在 TSQL 上使用 INNER JOIN 时的双计数结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在 TSQL 上使用 INNER JOIN 时的双计数结果
基础教程推荐
- SQL Server 中单行 MERGE/upsert 的语法 2021-01-01
- 无法在 ubuntu 中启动 mysql 服务器 2021-01-01
- Sql Server 字符串到日期的转换 2021-01-01
- 使用pyodbc“不安全"的Python多处理和数据库访问? 2022-01-01
- SQL Server:只有 GROUP BY 中的最后一个条目 2021-01-01
- 将数据从 MS SQL 迁移到 PostgreSQL? 2022-01-01
- 如何在 SQL Server 的嵌套过程中处理事务? 2021-01-01
- SQL Server 2016更改对象所有者 2022-01-01
- ERROR 2006 (HY000): MySQL 服务器已经消失 2021-01-01
- 在 VB.NET 中更新 SQL Server DateTime 列 2021-01-01