我目前正在建立一个数据库,用于简单的库存资产跟踪。我想拥有一个审计功能,该功能将计算一个立方体(cubicle)中的台式机,显示器和电话的数量。我对SQL并不了解很多,这是我第一个使用MSSQL的项目。该数据库是一个表,到目前为止还没有任何关系。我有一列称为devicetype的列,其中存储了DESKTOP,MONITOR,PHONE,ETC。我需要一种方法来为多维数据集计算每种设备类型。我的主键是资产标签。我的思考过程是这样的:
select Count(monitor,phone,desktop per cube)
from table
having count(devicetype.desktop>1), count(devicetype.phone>1), Count(devicetype.monitor>2).
我知道这不是您编写的方式,这只是解释我认为应该发生的事情。基本上,每个多维数据集应该只有1个台式机资产,1个电话资产和2个监控器资产。我想让查询告诉我所有不遵循这些规则的多维数据集,以便我们可以手动检查它们。我不确定我的数据库是否正确设置以执行此操作,而且我对查询的了解还不足以实现此目的。任何帮助,想法或问题都将是惊人的。谢谢
答案 0 :(得分:1)
我想你想要
Select [cube],
sum(case when devicetype = 'monitor' then 1 else 0 end) as num_monitors,
sum(case when devicetype = 'phone' then 1 else 0 end) as num_phones,
sum(case when devicetype = 'desktop' then 1 else 0 end) as num_desktops
from sampledata
group by [cube]
having sum(case when devicetype = 'monitor' then 1 else 0 end) <> 1 or
sum(case when devicetype = 'phone' then 1 else 0 end) <> 1 or
sum(case when devicetype = 'desktop' then 1 else 0 end) <> 2;
cube
是列的较差名称,因为它是SQL Server保留字。这意味着它需要逃脱。
答案 1 :(得分:0)
谢谢戈登!这非常有效,但我没有意识到这是保留字。我最终不得不为这些值+1。最终看起来像这样:
Select [cube],
sum(case when devicetype = 'monitor' then 1 else 0 end) as num_monitors,
sum(case when devicetype = 'phone' then 1 else 0 end) as num_phones,
sum(case when devicetype = 'desktop' then 1 else 0 end) as num_desktops
from table
group by [cube]
having sum(case when devicetype = 'monitor' then 1 else 0 end) > 2 or
sum(case when devicetype = 'phone' then 1 else 0 end) > 2 or
sum(case when devicetype = 'desktop' then 1 else 0 end) > 3;