Double count result when using INNER JOIN on TSQL









up vote
0
down vote

favorite












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


Where it should return:



produto | pacote | Execuções
---------+---------------+-----------
SafeSign | Desinstalação | 3
SafeSign | Instalação | 9
ScanBack | Instalação | 128


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


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


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


Thanks in advance!










share|improve this question























  • Maybe you want count distinct?
    – Andrew
    Nov 9 at 18:38










  • As Andrew stated, does "COUNT(DISTINCT p.produto)" work? Although, if you aren't getting back a single row, the better solution is to fix it so there is a one to one join. Can you provide table definitions and sample data?
    – UnhandledExcepSean
    Nov 9 at 18:43











  • Hi Andrew, I tried count distinct. It returns all values as 1.
    – mergulhao21
    Nov 9 at 18:54










  • Read this. stackoverflow.com/help/how-to-ask
    – Eric
    Nov 9 at 19:09










  • If you remove your GROUP BY and replace your columns with a star (ie: SELECT *) it might give you an idea why you have duplicates. It's hard to tell without knowing what data you have
    – Kevin Doyon
    Nov 9 at 19:11















up vote
0
down vote

favorite












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


Where it should return:



produto | pacote | Execuções
---------+---------------+-----------
SafeSign | Desinstalação | 3
SafeSign | Instalação | 9
ScanBack | Instalação | 128


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


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


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


Thanks in advance!










share|improve this question























  • Maybe you want count distinct?
    – Andrew
    Nov 9 at 18:38










  • As Andrew stated, does "COUNT(DISTINCT p.produto)" work? Although, if you aren't getting back a single row, the better solution is to fix it so there is a one to one join. Can you provide table definitions and sample data?
    – UnhandledExcepSean
    Nov 9 at 18:43











  • Hi Andrew, I tried count distinct. It returns all values as 1.
    – mergulhao21
    Nov 9 at 18:54










  • Read this. stackoverflow.com/help/how-to-ask
    – Eric
    Nov 9 at 19:09










  • If you remove your GROUP BY and replace your columns with a star (ie: SELECT *) it might give you an idea why you have duplicates. It's hard to tell without knowing what data you have
    – Kevin Doyon
    Nov 9 at 19:11













up vote
0
down vote

favorite









up vote
0
down vote

favorite











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


Where it should return:



produto | pacote | Execuções
---------+---------------+-----------
SafeSign | Desinstalação | 3
SafeSign | Instalação | 9
ScanBack | Instalação | 128


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


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


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


Thanks in advance!










share|improve this question















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


Where it should return:



produto | pacote | Execuções
---------+---------------+-----------
SafeSign | Desinstalação | 3
SafeSign | Instalação | 9
ScanBack | Instalação | 128


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


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


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


Thanks in advance!







sql sql-server tsql






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 9 at 19:47









marc_s

565k12610921243




565k12610921243










asked Nov 9 at 18:35









mergulhao21

186




186











  • Maybe you want count distinct?
    – Andrew
    Nov 9 at 18:38










  • As Andrew stated, does "COUNT(DISTINCT p.produto)" work? Although, if you aren't getting back a single row, the better solution is to fix it so there is a one to one join. Can you provide table definitions and sample data?
    – UnhandledExcepSean
    Nov 9 at 18:43











  • Hi Andrew, I tried count distinct. It returns all values as 1.
    – mergulhao21
    Nov 9 at 18:54










  • Read this. stackoverflow.com/help/how-to-ask
    – Eric
    Nov 9 at 19:09










  • If you remove your GROUP BY and replace your columns with a star (ie: SELECT *) it might give you an idea why you have duplicates. It's hard to tell without knowing what data you have
    – Kevin Doyon
    Nov 9 at 19:11

















  • Maybe you want count distinct?
    – Andrew
    Nov 9 at 18:38










  • As Andrew stated, does "COUNT(DISTINCT p.produto)" work? Although, if you aren't getting back a single row, the better solution is to fix it so there is a one to one join. Can you provide table definitions and sample data?
    – UnhandledExcepSean
    Nov 9 at 18:43











  • Hi Andrew, I tried count distinct. It returns all values as 1.
    – mergulhao21
    Nov 9 at 18:54










  • Read this. stackoverflow.com/help/how-to-ask
    – Eric
    Nov 9 at 19:09










  • If you remove your GROUP BY and replace your columns with a star (ie: SELECT *) it might give you an idea why you have duplicates. It's hard to tell without knowing what data you have
    – Kevin Doyon
    Nov 9 at 19:11
















Maybe you want count distinct?
– Andrew
Nov 9 at 18:38




Maybe you want count distinct?
– Andrew
Nov 9 at 18:38












As Andrew stated, does "COUNT(DISTINCT p.produto)" work? Although, if you aren't getting back a single row, the better solution is to fix it so there is a one to one join. Can you provide table definitions and sample data?
– UnhandledExcepSean
Nov 9 at 18:43





As Andrew stated, does "COUNT(DISTINCT p.produto)" work? Although, if you aren't getting back a single row, the better solution is to fix it so there is a one to one join. Can you provide table definitions and sample data?
– UnhandledExcepSean
Nov 9 at 18:43













Hi Andrew, I tried count distinct. It returns all values as 1.
– mergulhao21
Nov 9 at 18:54




Hi Andrew, I tried count distinct. It returns all values as 1.
– mergulhao21
Nov 9 at 18:54












Read this. stackoverflow.com/help/how-to-ask
– Eric
Nov 9 at 19:09




Read this. stackoverflow.com/help/how-to-ask
– Eric
Nov 9 at 19:09












If you remove your GROUP BY and replace your columns with a star (ie: SELECT *) it might give you an idea why you have duplicates. It's hard to tell without knowing what data you have
– Kevin Doyon
Nov 9 at 19:11





If you remove your GROUP BY and replace your columns with a star (ie: SELECT *) it might give you an idea why you have duplicates. It's hard to tell without knowing what data you have
– Kevin Doyon
Nov 9 at 19:11













2 Answers
2






active

oldest

votes

















up vote
0
down vote













There is really something missing in your question. This seems to produce the correct result; so, I think you need to provide a better example.



DECLARE @pdq TABLE (
ID int,produto nvarchar(50),pacote nvarchar(50),inicio datetime2,fim datetime2,duracao time, status nvarchar(50),equipamento nvarchar(50)
)

DECLARE @tempo_medio_execucao TABLE (
produto nvarchar(50),pacote nvarchar(50),tempo_minutos INT
)

INSERT INTO @pdq(id,produto,pacote,inicio,fim,duracao,status,equipamento) SELECT 1,'ScanBack','Instalação','2018-09-18 11:22:54.000','2018-09-18 11:27:43.000','00:04:49.0000000','Sucesso','Unknown'
INSERT INTO @pdq(id,produto,pacote,inicio,fim,duracao,status,equipamento) SELECT 2,'ScanBack','Instalação','2018-09-18 12:10:46.000','2018-09-18 12:11:04.000','00:00:17.0000000','Sucesso','Unknown'
INSERT INTO @pdq(id,produto,pacote,inicio,fim,duracao,status,equipamento) SELECT 3,'ScanBack','Instalação','2018-09-18 12:10:49.000','2018-09-18 12:11:17.000','00:00:27.0000000','Sucesso','Unknown'
INSERT INTO @pdq(id,produto,pacote,inicio,fim,duracao,status,equipamento) SELECT 4,'GRRF','Instalação','2018-09-18 12:28:43.000','2018-09-18 12:29:14.000','00:00:30.0000000','Sucesso','Unknown'

INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'ScanBack','Instalação',20
INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'Siric Zero','Instalação',20
INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'GRRF','Instalação',90
INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'SICCH','Instalação',15
INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'Outlook 2013','Instalação',25
INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT '7-Zip','Instalação',20
INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT '7-Zip','Desinstalação',20
INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'SafeSign','Instalação',20
INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'SafeSign','Desinstalação',20

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 @pdq AS p
INNER JOIN @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





share|improve this answer



























    up vote
    0
    down vote













    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.



    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.






    share|improve this answer




















      Your Answer






      StackExchange.ifUsing("editor", function ()
      StackExchange.using("externalEditor", function ()
      StackExchange.using("snippets", function ()
      StackExchange.snippets.init();
      );
      );
      , "code-snippets");

      StackExchange.ready(function()
      var channelOptions =
      tags: "".split(" "),
      id: "1"
      ;
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function()
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled)
      StackExchange.using("snippets", function()
      createEditor();
      );

      else
      createEditor();

      );

      function createEditor()
      StackExchange.prepareEditor(
      heartbeatType: 'answer',
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader:
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      ,
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      );



      );













       

      draft saved


      draft discarded


















      StackExchange.ready(
      function ()
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53231534%2fdouble-count-result-when-using-inner-join-on-tsql%23new-answer', 'question_page');

      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes








      up vote
      0
      down vote













      There is really something missing in your question. This seems to produce the correct result; so, I think you need to provide a better example.



      DECLARE @pdq TABLE (
      ID int,produto nvarchar(50),pacote nvarchar(50),inicio datetime2,fim datetime2,duracao time, status nvarchar(50),equipamento nvarchar(50)
      )

      DECLARE @tempo_medio_execucao TABLE (
      produto nvarchar(50),pacote nvarchar(50),tempo_minutos INT
      )

      INSERT INTO @pdq(id,produto,pacote,inicio,fim,duracao,status,equipamento) SELECT 1,'ScanBack','Instalação','2018-09-18 11:22:54.000','2018-09-18 11:27:43.000','00:04:49.0000000','Sucesso','Unknown'
      INSERT INTO @pdq(id,produto,pacote,inicio,fim,duracao,status,equipamento) SELECT 2,'ScanBack','Instalação','2018-09-18 12:10:46.000','2018-09-18 12:11:04.000','00:00:17.0000000','Sucesso','Unknown'
      INSERT INTO @pdq(id,produto,pacote,inicio,fim,duracao,status,equipamento) SELECT 3,'ScanBack','Instalação','2018-09-18 12:10:49.000','2018-09-18 12:11:17.000','00:00:27.0000000','Sucesso','Unknown'
      INSERT INTO @pdq(id,produto,pacote,inicio,fim,duracao,status,equipamento) SELECT 4,'GRRF','Instalação','2018-09-18 12:28:43.000','2018-09-18 12:29:14.000','00:00:30.0000000','Sucesso','Unknown'

      INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'ScanBack','Instalação',20
      INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'Siric Zero','Instalação',20
      INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'GRRF','Instalação',90
      INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'SICCH','Instalação',15
      INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'Outlook 2013','Instalação',25
      INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT '7-Zip','Instalação',20
      INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT '7-Zip','Desinstalação',20
      INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'SafeSign','Instalação',20
      INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'SafeSign','Desinstalação',20

      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 @pdq AS p
      INNER JOIN @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





      share|improve this answer
























        up vote
        0
        down vote













        There is really something missing in your question. This seems to produce the correct result; so, I think you need to provide a better example.



        DECLARE @pdq TABLE (
        ID int,produto nvarchar(50),pacote nvarchar(50),inicio datetime2,fim datetime2,duracao time, status nvarchar(50),equipamento nvarchar(50)
        )

        DECLARE @tempo_medio_execucao TABLE (
        produto nvarchar(50),pacote nvarchar(50),tempo_minutos INT
        )

        INSERT INTO @pdq(id,produto,pacote,inicio,fim,duracao,status,equipamento) SELECT 1,'ScanBack','Instalação','2018-09-18 11:22:54.000','2018-09-18 11:27:43.000','00:04:49.0000000','Sucesso','Unknown'
        INSERT INTO @pdq(id,produto,pacote,inicio,fim,duracao,status,equipamento) SELECT 2,'ScanBack','Instalação','2018-09-18 12:10:46.000','2018-09-18 12:11:04.000','00:00:17.0000000','Sucesso','Unknown'
        INSERT INTO @pdq(id,produto,pacote,inicio,fim,duracao,status,equipamento) SELECT 3,'ScanBack','Instalação','2018-09-18 12:10:49.000','2018-09-18 12:11:17.000','00:00:27.0000000','Sucesso','Unknown'
        INSERT INTO @pdq(id,produto,pacote,inicio,fim,duracao,status,equipamento) SELECT 4,'GRRF','Instalação','2018-09-18 12:28:43.000','2018-09-18 12:29:14.000','00:00:30.0000000','Sucesso','Unknown'

        INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'ScanBack','Instalação',20
        INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'Siric Zero','Instalação',20
        INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'GRRF','Instalação',90
        INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'SICCH','Instalação',15
        INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'Outlook 2013','Instalação',25
        INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT '7-Zip','Instalação',20
        INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT '7-Zip','Desinstalação',20
        INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'SafeSign','Instalação',20
        INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'SafeSign','Desinstalação',20

        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 @pdq AS p
        INNER JOIN @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





        share|improve this answer






















          up vote
          0
          down vote










          up vote
          0
          down vote









          There is really something missing in your question. This seems to produce the correct result; so, I think you need to provide a better example.



          DECLARE @pdq TABLE (
          ID int,produto nvarchar(50),pacote nvarchar(50),inicio datetime2,fim datetime2,duracao time, status nvarchar(50),equipamento nvarchar(50)
          )

          DECLARE @tempo_medio_execucao TABLE (
          produto nvarchar(50),pacote nvarchar(50),tempo_minutos INT
          )

          INSERT INTO @pdq(id,produto,pacote,inicio,fim,duracao,status,equipamento) SELECT 1,'ScanBack','Instalação','2018-09-18 11:22:54.000','2018-09-18 11:27:43.000','00:04:49.0000000','Sucesso','Unknown'
          INSERT INTO @pdq(id,produto,pacote,inicio,fim,duracao,status,equipamento) SELECT 2,'ScanBack','Instalação','2018-09-18 12:10:46.000','2018-09-18 12:11:04.000','00:00:17.0000000','Sucesso','Unknown'
          INSERT INTO @pdq(id,produto,pacote,inicio,fim,duracao,status,equipamento) SELECT 3,'ScanBack','Instalação','2018-09-18 12:10:49.000','2018-09-18 12:11:17.000','00:00:27.0000000','Sucesso','Unknown'
          INSERT INTO @pdq(id,produto,pacote,inicio,fim,duracao,status,equipamento) SELECT 4,'GRRF','Instalação','2018-09-18 12:28:43.000','2018-09-18 12:29:14.000','00:00:30.0000000','Sucesso','Unknown'

          INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'ScanBack','Instalação',20
          INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'Siric Zero','Instalação',20
          INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'GRRF','Instalação',90
          INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'SICCH','Instalação',15
          INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'Outlook 2013','Instalação',25
          INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT '7-Zip','Instalação',20
          INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT '7-Zip','Desinstalação',20
          INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'SafeSign','Instalação',20
          INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'SafeSign','Desinstalação',20

          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 @pdq AS p
          INNER JOIN @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





          share|improve this answer












          There is really something missing in your question. This seems to produce the correct result; so, I think you need to provide a better example.



          DECLARE @pdq TABLE (
          ID int,produto nvarchar(50),pacote nvarchar(50),inicio datetime2,fim datetime2,duracao time, status nvarchar(50),equipamento nvarchar(50)
          )

          DECLARE @tempo_medio_execucao TABLE (
          produto nvarchar(50),pacote nvarchar(50),tempo_minutos INT
          )

          INSERT INTO @pdq(id,produto,pacote,inicio,fim,duracao,status,equipamento) SELECT 1,'ScanBack','Instalação','2018-09-18 11:22:54.000','2018-09-18 11:27:43.000','00:04:49.0000000','Sucesso','Unknown'
          INSERT INTO @pdq(id,produto,pacote,inicio,fim,duracao,status,equipamento) SELECT 2,'ScanBack','Instalação','2018-09-18 12:10:46.000','2018-09-18 12:11:04.000','00:00:17.0000000','Sucesso','Unknown'
          INSERT INTO @pdq(id,produto,pacote,inicio,fim,duracao,status,equipamento) SELECT 3,'ScanBack','Instalação','2018-09-18 12:10:49.000','2018-09-18 12:11:17.000','00:00:27.0000000','Sucesso','Unknown'
          INSERT INTO @pdq(id,produto,pacote,inicio,fim,duracao,status,equipamento) SELECT 4,'GRRF','Instalação','2018-09-18 12:28:43.000','2018-09-18 12:29:14.000','00:00:30.0000000','Sucesso','Unknown'

          INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'ScanBack','Instalação',20
          INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'Siric Zero','Instalação',20
          INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'GRRF','Instalação',90
          INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'SICCH','Instalação',15
          INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'Outlook 2013','Instalação',25
          INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT '7-Zip','Instalação',20
          INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT '7-Zip','Desinstalação',20
          INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'SafeSign','Instalação',20
          INSERT INTO @tempo_medio_execucao(produto,pacote,tempo_minutos) SELECT 'SafeSign','Desinstalação',20

          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 @pdq AS p
          INNER JOIN @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






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 9 at 20:45









          UnhandledExcepSean

          9,49522040




          9,49522040






















              up vote
              0
              down vote













              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.



              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.






              share|improve this answer
























                up vote
                0
                down vote













                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.



                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.






                share|improve this answer






















                  up vote
                  0
                  down vote










                  up vote
                  0
                  down vote









                  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.



                  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.






                  share|improve this answer












                  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.



                  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.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Nov 9 at 21:28









                  Gordon Linoff

                  744k32285390




                  744k32285390



























                       

                      draft saved


                      draft discarded















































                       


                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function ()
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53231534%2fdouble-count-result-when-using-inner-join-on-tsql%23new-answer', 'question_page');

                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      Kleinkühnau

                      Makov (Slowakei)

                      Deutsches Schauspielhaus