Pessoal, como posso fazer 2 SELECT no SQL sendo que vai ter dois COUNT separando o resultado em duas colunas?

HTML

PHP

Banco de Dados

28/04/2018

Sendo que na tabela tem os seguintes dados:

Nome | Segmento |
Pedro | Privado |
Maria | Privado |
João | Outros |
Maria | Outros |
João | Outros |
João | Outros |
Maria | Privado |
Pedro | Outros |
Pedro | Outros |

Desejo que fiquem dessa forma após fazer a consulta do sql:

Nome | qtd1 | qtd2 |
Pedro | 1 | 2 |
Maria | 2 | 1 |
João | 0 | 3 |

No SQL fiz da seguinte forma porém não deu certo, alguém pode me ajudar a corrigir ou da opiniões de como fazer?

sql = "SELECT Nome, COUNT(Segmento) AS qtd1 FROM production WHERE [Segmento] = Privado GROUP BY Nome

UNION ALL

SELECT Nome, COUNT(Segmento) AS qtd2 FROM production WHERE [Segmento] = Outros GROUP BY Nome";

Novato

Novato

Curtidas 0

Melhor post

Jerson Boer

Jerson Boer

28/04/2018

Olá Novato, veja se atende ao que precisa:

SELECT DISTINCT 
	production.Nome, CASE WHEN ContaSegmentoOutros.QtdeOutros IS NULL THEN 0 ELSE ContaSegmentoOutros.QtdeOutros END AS Outros, 
	CASE WHEN ContaSegmentoPrivado.QtdePrivado IS NULL THEN 0 ELSE ContaSegmentoPrivado.QtdePrivado END AS Privado
FROM production LEFT OUTER JOIN
	(SELECT Nome, Segmento, COUNT(Segmento) AS QtdeOutros
		FROM production
		WHERE (Segmento = 'Outros')
		GROUP BY Nome, Segmento) AS ContaSegmentoOutros ON ContaSegmentoOutros.Nome = production.Nome LEFT OUTER JOIN
    (SELECT Nome, Segmento, COUNT(Segmento) AS QtdePrivado
    FROM production
    WHERE (Segmento = 'Privado')
    GROUP BY Nome, Segmento) AS ContaSegmentoPrivado ON ContaSegmentoPrivado.Nome = production.Nome
GOSTEI 3

Mais Respostas

Novato

Novato

28/04/2018

Olá Jerson, não funcionou! Para conhecimentos a todos eu estou buscando as informações do banco de dados access e jogando em uma página PHP.

Aqui está o código completo:

$sql = "SELECT DISTINCT
    production.Nome, CASE WHEN ContaSegmentoOutros.QtdeOutros IS NULL THEN 0 ELSE ContaSegmentoOutros.QtdeOutros END AS Outros, 
    CASE WHEN ContaSegmentoPrivado.QtdePrivado IS NULL THEN 0 ELSE ContaSegmentoPrivado.QtdePrivado END AS Privado
FROM production LEFT OUTER JOIN
    (SELECT Nome, Segmento, COUNT(Segmento) AS QtdeOutros
        FROM production
        WHERE (Segmento = 'Outros')
        GROUP BY Nome, Segmento) AS ContaSegmentoOutros ON ContaSegmentoOutros.Nome = production.Nome LEFT OUTER JOIN
    (SELECT Nome, Segmento, COUNT(Segmento) AS QtdePrivado
    FROM production
    WHERE (Segmento = 'Privado')
    GROUP BY Nome, Segmento) AS ContaSegmentoPrivado ON ContaSegmentoPrivado.Nome = production.Nome";
$result = $conexao->query($sql);
while ($row = $result->fetch()){
  echo "<tr><td>" . $row['Nome'] . "</td>
        <td>" . $row['QtdeOutros'] . "</td>
        <td>" . $row['QtdePrivado'] . "</td>
        <td>" . "Abril" . "</td></tr></span>";
}



Esse outro código funciona porém não atende a minha necessidade pois na tabela apresenta somente a quantidade do Segmento "Outros" de cada Nome e desejo mais uma coluna com a quantidade do Segmento "Privado".

$sql = "SELECT Nome, COUNT(Segmento) AS qtd FROM production WHERE [Segmento] = 'Outros' GROUP BY Nome";
$result = $conexao->query($sql);
while ($row = $result->fetch()){
  echo "<tr><td>". $row['Nome'] . "</td>
        <td>" . $row['qtd'] . "</tr></span>";
}

echo "</table>";
?>


Tabela que aparece no PHP:

Nome | qtd |
Pedro | 1 |
Maria | 2 |
João | 0 |

Tabela que desejo:

Nome | qtd1 | qtd2 |
Pedro | 1 | 2 |
Maria | 2 | 1 |
João | 0 | 3 |

Obs: Se conseguirem mudando completamente sql que funcione pode mandar que aceito.
GOSTEI 0
Jerson Boer

Jerson Boer

28/04/2018

Veja se não é aqui o problema, os nomes do campo na consulta e o nome que está buscando a linha estão diferentes:

<td>" . $row['QtdeOutros'] . "</td>
<td>" . $row['QtdePrivado'] . "</td>

Mude para:

<td>" . $row['Outros'] . "</td>
<td>" . $row['Privado'] . "</td>
GOSTEI 1
Novato

Novato

28/04/2018

Não, tentei mudando esse campo para diversas situações porém não teve êxito.
GOSTEI 0
Jerson Boer

Jerson Boer

28/04/2018

Não apresenta resultado nenhum? Dá algum erro? Você tentou rodar essa consulta direta em banco?
GOSTEI 0
Jerson Boer

Jerson Boer

28/04/2018

Qual a versão do seu Access? Veja se essa funciona:

TRANSFORM Count(production.[Código]) AS ContarDeCódigo
SELECT production.[Nome]
FROM production
GROUP BY production.[Nome]
PIVOT production.[Segmento];
GOSTEI 2
Leandro Sousa

Leandro Sousa

28/04/2018

Tenta fazer o select assim:<br />
<br />
select<br />
usu.Id_Usuario<br />
, usu.Nm_Usuario<br />
, count(distinct grp.Id_Grupo) as Qtde_Grupo<br />
, count(distinct per.Id_Perfil) as Qtde_Motivo<br />
from <br />
Usuario usu with(nolock)<br />
left join Grupo grp with(nolock) on grp.Id_Usuario = usu.Id_Usuario<br />
left join Perfil per with(nolock) on per.Id_Usuario = usu.Id_Usuario<br />
group by usu.Nm_Usuario,usu.Id_Usuario
GOSTEI 0
Novato

Novato

28/04/2018

Muito obrigado pelas respostas porém não foi solucionado o meu problema.
GOSTEI 0
Novato

Novato

28/04/2018

Não funcionou
Não apresenta nenhum resultado
versão do access 2002 e 2003
Qual a versão do seu Access? Veja se essa funciona:

TRANSFORM Count(production.[Código]) AS ContarDeCódigo
SELECT production.[Nome]
FROM production
GROUP BY production.[Nome]
PIVOT production.[Segmento];



Não entendi esse sql:
Tenta fazer o select assim:
<br />
<br />
select<br />
usu.Id_Usuario<br />
,	usu.Nm_Usuario<br />
,	count(distinct grp.Id_Grupo)	as Qtde_Grupo<br />
,	count(distinct per.Id_Perfil)	as Qtde_Motivo<br />
from	<br />
Usuario	usu with(nolock)<br />
left join Grupo	grp with(nolock) on grp.Id_Usuario = usu.Id_Usuario<br />
left join Perfil	per with(nolock) on per.Id_Usuario = usu.Id_Usuario<br />
group by usu.Nm_Usuario,usu.Id_Usuario


GOSTEI 0
Novato

Novato

28/04/2018

Pessoal, com ajuda de vocês consegui da seguinte forma:
Os resultados estão exibindo corretamente, porém com sinal de menos ao lado (-) e acrescentando ".0" em todos os resultados. Como faço para corrigir?

$sql = "SELECT Nome, SUM([Segmento] = 'Privado') AS qtd, SUM([Segmento] = 'Outros') AS qtd2 FROM tb_nova_production GROUP BY Nome";
  
$result = $conexao->query($sql);
while ($row = $result->fetch()){
  echo "<tr><td>" . $row[''Nome''] . "</td>
        <td>" . $row[''qtd'']  . "</td>
        <td>" . $row[''qtd2'']  . "</td></tr></span>";
}

Está exibindo dessa forma:

Nome | Outros | Privado |
--------------------------
João | -3.0 | -0.0 |
Maria | -1.0 | -2.0 |
Pedro | -2.0 | -1.0 |
GOSTEI 0
POSTAR