Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ndias

contar registros do mês, sem repetí-lo na mesma data

Recommended Posts

Seguinte: Preciso fazer um select e contar todos os registros do mês, sem repetir o mesmo registro na mesma data (ele pode se repetir no mês, mas não na mesma data).

 

 

/*aqui eu tenho o total de diferentes campos*/

SELECT DISTINCT(F3.campo) AS campo, COUNT(F3.registro) AS Qtde

FROM tabela F3

WHERE

F3.id IN

(

/*aqui eu tenho os diferentes registros em cada data*/

SELECT DISTINCT(F2.id) AS id

FROM tabela F2

WHERE

CONVERT(Date,F2.data,103) IN

(

/*aqui eu tenho as diferentes datas de registros no mês*/

SELECT DISTINCT(CONVERT(Date,F.data,103)) AS data

FROM tabela F

WHERE

MONTH(CONVERT(Date,F. data,103)) = 4

AND YEAR(CONVERT(Date,F. data,103)) = 2015

)

AND MONTH(CONVERT(Date,F2. data,103)) = 4

AND YEAR(CONVERT(Date,F2. data,103)) = 2015

)

AND MONTH(CONVERT(DateTime,F3. data,103)) = 4

AND YEAR(CONVERT(DateTime,F3. data,103)) = 2015

GROUP BY campo

 

 

O que está faltando que eu estou fazendo de errado?

 

Alguém pode me ajudar, por favor?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse select todo da o mesmo resultado disso aqui:

 

SELECT DISTINCT(campo) AS campo, COUNT(registo) AS Qtde FROM tabela WHERE MONTH(CONVERT(Date,data,103)) = 4 AND YEAR(CONVERT(DateTime,data,103)) = 2015 GROUP BY campo

 

Exemplo de resultado:

 

campo1 = 10

campo2 = 20

campo3 = 40

campo4 = 60

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um exemplo rapido:

 

 

declare @table table (campo varchar(max), registro varchar(max), data datetime )
 
insert into @table values ('CAMPO A', 'registro a', '2015-01-01')
insert into @table values ('CAMPO A', 'registro a', '2015-01-03')
insert into @table values ('CAMPO A', 'registro a', '2015-01-28')
 
insert into @table values ('CAMPO A', 'registro a', '2015-02-01')
insert into @table values ('CAMPO A', 'registro a', '2015-02-01')
 
 
insert into @table values ('CAMPO B', 'registro B', '2015-01-01')
insert into @table values ('CAMPO B', 'registro B', '2015-01-03')
 
insert into @table values ('CAMPO B', 'registro B', '2015-03-01')
insert into @table values ('CAMPO B', 'registro B', '2015-03-01')
insert into @table values ('CAMPO B', 'registro B', '2015-03-02')
 
--  Preciso fazer um select e contar todos os registros do mês
-- , sem repetir o mesmo registro na mesma data 
 
select COUNT(*) qtde, a.registro, datepart(month,a.data) as Mes, datepart(YEAR,a.data) as Ano
from (
select registro,data from @table group by registro,data
) a
group by a.registro, datepart(month,a.data) , datepart(YEAR,a.data)  
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

traz o mesmo resultado do select do post 2...ou seja, não está deixando de contar os registros repetidos no mesmo dia

Compartilhar este post


Link para o post
Compartilhar em outros sites

de alguma forma, isso aqui dá certo:

 

select COUNT(*) qtde, a.registro, convert(date,a.data,103) as data
from (
select registro,data from tabela where month(convert(date,data,103)) = 4 and year(convert(date,data,103)) = 2015 group by registro,data
) a
group by a.registro, convert(date,a.data,103)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Algo assim ?

 

 

Select data,count(*)

From

(Select data

From tabela

Group by data) virtual

Group by data

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não conta não.

Olha os registros:

campo      registro             data
-------------------------------------------------
CAMPO A    registro a    2015-01-01 00:00:00.000
CAMPO A    registro a    2015-01-03 00:00:00.000
CAMPO A    registro a    2015-01-28 00:00:00.000
CAMPO A    registro a    2015-02-01 00:00:00.000
CAMPO A    registro a    2015-02-01 00:00:00.000
CAMPO B    registro B    2015-01-01 00:00:00.000
CAMPO B    registro B    2015-01-03 00:00:00.000
CAMPO B    registro B    2015-03-01 00:00:00.000
CAMPO B    registro B    2015-03-01 00:00:00.000
CAMPO B    registro B    2015-03-02 00:00:00.000

Note que para o CAMPO A, MES 02 tenho dois registros no dia e no resultado eu conto ele somente 1 vez:

qtde registro    Mes Ano
----------- -----------
3    registro a  1 2015
1    registro a  2 2015
2    registro B  1 2015
2    registro B  3 2015

Compartilhar este post


Link para o post
Compartilhar em outros sites

A.Jr, me ajuda mais uma vez por favor.

 

Desta vez eu preciso fazer um select e contar todos os registros por hora, sem repetir o mesmo registro no mesmo dia...

 

Eu to usando o distinct, mas como eu coloco a condição where para buscar registros de determinada hora, ele só distingue se tiver o mesmo registro na mesma hora...

 

SELECT COUNT(DISTINCT(id)) AS id FROM tabela WHERE CONVERT(VARCHAR(5),CONVERT(DateTime,data,103),108) = '&hora&' AND DAY(CONVERT(DateTime,data,103)) = "&dia&" AND MONTH(CONVERT(DateTime,data,103)) = "&mes&" AND YEAR(CONVERT(DateTime,data,103)) = "&ano &"

Compartilhar este post


Link para o post
Compartilhar em outros sites

 


Desta vez eu preciso fazer um select e contar todos os registros por hora, sem repetir o mesmo registro no mesmo dia..

 

 

Se vc agrupar por hora ele vai contar o mesmo dia....

nao seria sem repetir o dia e hora??

Compartilhar este post


Link para o post
Compartilhar em outros sites

então A.Jr, não é nada disso não

com sua ajuda no exemplo antrior eu conseguir fazer o select q agrupasse registros distintos no dia, que pudesse se repetir no mês, mas não no mesmo dia

agora eu preciso a mesma coisa (agrupar registros distintos no dia), mas quero saber a hora desses registros...

daí, por causa disso, se eu agrupar por hora ele vai contar registros repetidos no mesmo dia....

 

por ex:

 

'registros distintos no dia, que se repetem no mês, mas não no mesmo dia

select COUNT(*) qtde, a.registro, convert(date,a.data,103) as data

from (
select registro,data from tabela where convert(date,data,103) = convert(date,'14/05/2015',103) group by registro,data
) a
group by a.registro, convert(date,a.data,103)
SE EU QUISER SABER A HORA É SÓ MUDAR O CONVERT PARA datetime...SÓ QUE ISSO CONTA OS REGISTROS REPETIDOS NO DIA

Compartilhar este post


Link para o post
Compartilhar em outros sites

com ajuda de um colega de outro forum, consegui fazer dar certo da seguinte maneira:

 

select

registro,

convert(date, data, 103) as data,

min(CONVERT(TIME, data , 103)) as hora

from tabela

where

convert(date, data, 103) = convert(date, '14/05/2015', 103)

group by

registro,

convert(date, data, 103)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.