Sql 在视图中添加两个计算字段的值,形成第三个计算列

Sql 在视图中添加两个计算字段的值,形成第三个计算列,sql,sql-server,Sql,Sql Server,我正在为我们的移动设备管理系统开发一个视图,该系统以字节为单位收集蜂窝数据使用情况。我有一个转换函数,可以将下载和上载从字节转换为GB,作为两个额外的列。这里没有total列,我不需要以字节为单位的总数,但我需要的是以GB为单位的总数。因此,我试图为每一行添加计算出的“下载(GB)”和“上传(GB)”的内容 该视图的SQL代码如下所示(我对其进行了格式化,希望它看起来更具可读性) 执行转换的行包括: CONVERT(DECIMAL(10, 2), dbo.DeviceStatNetTraffic

我正在为我们的移动设备管理系统开发一个视图,该系统以字节为单位收集蜂窝数据使用情况。我有一个转换函数,可以将下载和上载从字节转换为GB,作为两个额外的列。这里没有total列,我不需要以字节为单位的总数,但我需要的是以GB为单位的总数。因此,我试图为每一行添加计算出的“下载(GB)”和“上传(GB)”的内容

该视图的SQL代码如下所示(我对其进行了格式化,希望它看起来更具可读性)

执行转换的行包括:

CONVERT(DECIMAL(10, 2), dbo.DeviceStatNetTraffic.Upload / 1024 / 1024 / 1024) AS [Upload (GB)],
CONVERT(DECIMAL(10, 2), dbo.DeviceStatNetTraffic.Download / 1024 / 1024 / 1024) AS [Download (GB)]
我试过这样的方法:

SUM('Upload (GB)' + 'Download (GB)') AS [Total (GB)]

SUM(dbo.custom_datausage.'Upload (GB)' + dbo.custom_datausage.'Download (GB)') AS [Total (GB)]
但两者都不起作用。我对两个计算字段的求和或相加做了一些调查,但我不能真正理解它,因为SQL不是我的专业领域,也不是我的日常工作。此外,这些示例看起来更适合正在运行的查询,而不是其他系统将从中提取的视图

如果能够获得上传(GB)、下载(GB)和总列数(GB)的帮助,我们将不胜感激

以下是移除任何PII(人员信息)的当前输出示例:


您需要将字段转换为十进制,然后除以1024 3倍

declare @bytes int = 131430179 

select convert(decimal, @bytes)/1024/1024/1024 as GB
在整型字段被分割后,您正在转换数据,因此您失去了精度

输出:

0.1224038926877929 GB

SQL Server进行整数除法,因此
1/2
0
而不是
0.5
。将结果转换为十进制并不能解决此问题

解决此问题的最简单方法是输入小数点:

CONVERT(DECIMAL(10, 2), dbo.DeviceStatNetTraffic.Upload / 1024.0 / 1024.0 / 1024.0) AS [Upload (GB)],
请注意,您应该学习使用表别名,以便查询更易于阅读:

CONVERT(DECIMAL(10, 2), dst.Upload / 1024.0 / 1024.0 / 1024.0) AS [Upload (GB)],

如果要为每一行创建一个总计列(上载+下载),则需要按即将出现的列对这些值求和,而不是按您声明的别名。 使用SUM()时,需要使用GROUP BY子句,因为这将对所有行的值求和(因为可以通过查询对这些值求和,所以这很有意义)

尝试将这两个值相加(以字节为单位),以便转换为Gb:

SELECT
dbo.DevInfo.DevId,
dbo.DevInfo.DevName,
dbo.AndroidWorkProduct.Title,
dbo.DeviceStatNetTraffic.Application,
dbo.DeviceStatNetTraffic.TimeStamp,
dbo.DeviceStatNetTraffic.Upload,
dbo.DeviceStatNetTraffic.Download,
dbo.DevInfo.LastCheckInTime,
dbo.Person.LoginName,
dbo.Person.FirstName,
dbo.Person.MiddleName,
dbo.Person.LastName,
dbo.DeviceGroup.Name,
dbo.DevInfo.Model,
dbo.DevInfo.Manufacturer,
dbo.DevInfo.OSVersion,
dbo.DevInfo.PhoneNumber,
dbo.Person.CustomProperty1,
dbo.Person.CustomProperty2,
CONVERT(DECIMAL(10, 2), dbo.DeviceStatNetTraffic.Upload / 1024 / 1024 / 1024) AS [Upload (GB)],
CONVERT(DECIMAL(10, 2), dbo.DeviceStatNetTraffic.Download / 1024 / 1024 / 1024) AS [Download (GB)],
CONVERT(DECIMAL(10,2), (dbo.DeviceStatNetTraffic.Upload + dbo.DeviceStatNetTraffic.Download) / 1024 / 1024 / 1024) AS [Total (Gb)]
FROM           
dbo.DeviceStatNetTraffic
WITH (NOLOCK) INNER JOIN dbo.DevInfo WITH (NOLOCK) ON dbo.DeviceStatNetTraffic.DeviceId = dbo.DevInfo.DeviceId
INNER JOIN dbo.Person ON dbo.DevInfo.CurrentPersonId = dbo.Person.PersonId
INNER JOIN dbo.DeviceGroupDevice ON dbo.DevInfo.DeviceId = dbo.DeviceGroupDevice.DeviceId
INNER JOIN dbo.DeviceGroup ON dbo.DeviceGroupDevice.DeviceGroupId = dbo.DeviceGroup.DeviceGroupId
INNER JOIN dbo.AndroidWorkProduct ON dbo.DeviceStatNetTraffic.Application = dbo.AndroidWorkProduct.AndroidProductId

让帮助你变得容易-简化!仅供参考,应避免使用。坚持使用对象的别名,并使用这些别名来限定列。这将使您的sQL更加简洁。良好地使用空白也不会影响可重读性;所有左对齐的代码都很难阅读。首先,使用
SUM
很可能意味着您希望执行
分组查询。您还可以包含您想要执行的查询的最低版本吗?您的问题是,您在同一个select中定义了计算列,并希望在其中重用这些别名。你不能那样做。
但也不能工作
你这到底是什么意思?你发现语法错误了吗?结果不符合预期?这是否回答了您的问题?
CONVERT(DECIMAL(10, 2), dst.Upload / 1024.0 / 1024.0 / 1024.0) AS [Upload (GB)],
SELECT
dbo.DevInfo.DevId,
dbo.DevInfo.DevName,
dbo.AndroidWorkProduct.Title,
dbo.DeviceStatNetTraffic.Application,
dbo.DeviceStatNetTraffic.TimeStamp,
dbo.DeviceStatNetTraffic.Upload,
dbo.DeviceStatNetTraffic.Download,
dbo.DevInfo.LastCheckInTime,
dbo.Person.LoginName,
dbo.Person.FirstName,
dbo.Person.MiddleName,
dbo.Person.LastName,
dbo.DeviceGroup.Name,
dbo.DevInfo.Model,
dbo.DevInfo.Manufacturer,
dbo.DevInfo.OSVersion,
dbo.DevInfo.PhoneNumber,
dbo.Person.CustomProperty1,
dbo.Person.CustomProperty2,
CONVERT(DECIMAL(10, 2), dbo.DeviceStatNetTraffic.Upload / 1024 / 1024 / 1024) AS [Upload (GB)],
CONVERT(DECIMAL(10, 2), dbo.DeviceStatNetTraffic.Download / 1024 / 1024 / 1024) AS [Download (GB)],
CONVERT(DECIMAL(10,2), (dbo.DeviceStatNetTraffic.Upload + dbo.DeviceStatNetTraffic.Download) / 1024 / 1024 / 1024) AS [Total (Gb)]
FROM           
dbo.DeviceStatNetTraffic
WITH (NOLOCK) INNER JOIN dbo.DevInfo WITH (NOLOCK) ON dbo.DeviceStatNetTraffic.DeviceId = dbo.DevInfo.DeviceId
INNER JOIN dbo.Person ON dbo.DevInfo.CurrentPersonId = dbo.Person.PersonId
INNER JOIN dbo.DeviceGroupDevice ON dbo.DevInfo.DeviceId = dbo.DeviceGroupDevice.DeviceId
INNER JOIN dbo.DeviceGroup ON dbo.DeviceGroupDevice.DeviceGroupId = dbo.DeviceGroup.DeviceGroupId
INNER JOIN dbo.AndroidWorkProduct ON dbo.DeviceStatNetTraffic.Application = dbo.AndroidWorkProduct.AndroidProductId