在 TSQL 上使用 INNER JOIN 时的双计数结果

2021-09-10 00:00:00 sql tsql sql-server

我正在使用以下查询来计算所有脚本运行的次数,但是当一个软件有 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.

相关文章