这个简单的查询是否会导致按天对附件进行分组并给我每日附件的总数以及平均大小?
我查询的唯一表是附件详细信息(电子邮件附件)
[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
还如何将我从我的 avg() 获得的值保留到小数点后 2 位?
您应该在转换为小数时指定精度和比例,并最后执行该转换。这篇博客文章解释了为什么你永远不想省略 的大小声明
char/varchar/nchar/nvarchar
,但类似的参数也适用于小数和其他一些数字类型。此外,在 2008+ 上,
CONVERT(DATE
是一种更有效(且更易于阅读)的剥离时间的方法(参见这篇文章和这篇后续文章)。以下是我将如何编写您的查询:
(另外,使用模式前缀和语句终止符。总是。)
如果您只想要平均两位小数,您可以 CAST 为限制精度的 DECIMAL 类型,如下所示:
看起来您将“大小”转换为十进制只是为了让数学以十进制而不是整数的形式工作,您可能会舍入太多。这并不重要,但我更喜欢通过指定十进制常量来做到这一点,因为我认为它更容易阅读。我会像这样重写该专栏:
如果您使用的是最新版本的 SQL Server,您可能还有一种更简单的方法来创建 date_only 列。您可以将 DATETIME 值转换为不包含任何时间信息的 DATE 类型:
除此之外,我认为您的查询符合您的预期。