essa consulta simples resulta no agrupamento dos anexos por dia e me fornece o número total de anexos diários, bem como o tamanho médio?
a única tabela que estou consultando é attachmentdetail (anexos de e-mail)
[attachmentdetail]
AttachmentId int
Name varchar
Size int
IsInline bit
InsertedDatetime datetime
select
count(*) as [Tally],
avg( cast(size as decimal)/1024/1024) as avgSize,
DateAdd(dd, DateDiff(dd, 0, InsertedDatetime), 0) As [date_only]
from attachmentdetail
where isinline <>1
group by DateAdd(dd, DateDiff(dd, 0, InsertedDatetime), 0)
order by [date_only] desc
também como manter os valores que recebo de meu avg () em 2 casas decimais?
Você deve especificar a precisão e a escala ao converter para um decimal e executar essa conversão por último . Esta postagem do blog explica por que você nunca deseja deixar de fora a declaração de tamanho para
char/varchar/nchar/nvarchar
, mas argumentos semelhantes também são válidos para decimal e alguns outros tipos numéricos.Além disso, em 2008+,
CONVERT(DATE
é um método um pouco mais eficiente (e mais fácil de ler) de reduzir o tempo (consulte esta postagem e esta continuação ).Aqui está como eu escreveria sua consulta:
(Além disso, use prefixos de esquema e terminadores de instrução . Sempre.)
Se você quiser apenas duas casas decimais na média, você pode CAST para um tipo DECIMAL limitando a precisão, assim:
Parece que você está convertendo "tamanho" para decimal apenas para fazer a matemática funcionar como decimal em vez de números inteiros, onde você pode arredondar demais. Não importa muito, mas prefiro fazer isso especificando uma constante decimal porque acho que é mais fácil de ler. Eu reescreveria essa coluna assim:
Se estiver usando uma versão recente do SQL Server, você também pode ter uma maneira mais simples de criar sua coluna date_only. Você pode apenas converter o valor DATETIME para um tipo DATE, que não inclui nenhuma informação de tempo:
Fora isso, acho que sua consulta faz o que você diz que espera.