Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从SQL中的4个表中统计已使用和释放的许可证?_Sql_Sql Server_Tsql - Fatal编程技术网

如何从SQL中的4个表中统计已使用和释放的许可证?

如何从SQL中的4个表中统计已使用和释放的许可证?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有4个表,其中包含有关许可证的信息。我们有自己的安装包来安装应用程序,因此PackageName引用了这个安装包名称。我们可能有三次相同的软件包,它们之间唯一的区别是,第一次是英语,第二次是德语,第三次是多语言软件包 各表如下: 许可证:此表包含我们为一个应用程序购买了多少许可证的信息 LicenseID int PackageName nvarchar(50) 显示名称nvarchar(200) 购买整数 注册:此表包含有关在哪个主机上安装了哪个应用程序(仅限需要许可证的应用程序)的信息 L

我有4个表,其中包含有关许可证的信息。我们有自己的安装包来安装应用程序,因此PackageName引用了这个安装包名称。我们可能有三次相同的软件包,它们之间唯一的区别是,第一次是英语,第二次是德语,第三次是多语言软件包

各表如下:

许可证:此表包含我们为一个应用程序购买了多少许可证的信息

LicenseID int
PackageName nvarchar(50)
显示名称nvarchar(200)
购买整数

注册:此表包含有关在哪个主机上安装了哪个应用程序(仅限需要许可证的应用程序)的信息
LicenseID int
主机nvarchar(50)

到目前为止还不错,但问题从现在开始。在某些情况下,一个许可证可以替代另一个许可证。例如,如果我们有office 2010许可证,那么我们也可以使用它们来安装office 2007。所以我需要另一个表来存储哪个许可证可以替代另一个许可证

替换:在这个表中,只有关于哪个licenseID可以替换哪个的信息。所以我的意思是,如果office 2010有一个LicenseID
1
,office 2007有一个LicenseID
2
,那么在这个表中将保持
1,2

LicenseID int
替代的许可证ID

第四个表是关联:此表包含属于同一许可证的包的信息。这是必需的,因为如果我们有两个包到同一个许可证呢?我的意思是,如果我们有一个德语版的Symantec Antivirus 10软件包,我们也有一个英语版的Symantec Antivirus 10软件包,那么我必须将这些软件包安装到同一个软件中,因此他们必须使用相同的许可证。
PackageName nvarchar(50)
LicenseID int

因此,在这种情况下,如果Symantec Antivirus拥有许可证ID 5:
Symnatec Antivirus 10 DE,5
Symantec Antivirus 10 EN,5
赛门铁克防病毒软件10 MU,5

所以我的问题是,我如何计算我的执照?我试图创建一个视图或存储过程,但对我来说这太复杂了。有人能帮我吗


谢谢

这就是你要找的吗?从您的描述中,我无法告诉您的软件包和注册表与许可证计数有何关联,但如果有,请详细说明

create table License(ID int, Name varchar(200), Bought int)
create table Package(ID int, PkgName varchar(200), LicenseID int)

insert into License(ID,Name,Bought) values(1,'Office 2010',3)
insert into License(ID,Name,Bought) values(2,'Office 2007',2)
insert into License(ID,Name,Bought) values(3,'Office 2003',1)
insert into Substitute(ParentLicenseID, SubLicenseID) values(1,2)
insert into Substitute(ParentLicenseID, SubLicenseID) values(1,3)
insert into Substitute(ParentLicenseID, SubLicenseID) values(2,3)

select
    ParentLicenseID=l.ID,
    ParentLicenseName=l.Name,
    BoughtDirectly=coalesce(l.Bought,0),
    BoughtIndirectly=sum(coalesce(l2.Bought,0)),
    TotalBought=coalesce(l.Bought,0)+sum(coalesce(l2.Bought,0))
from
    License l
    left outer join Substitute s on s.SubLicenseID = l.ID
    left outer join License l2 on l2.ID = s.ParentLicenseID
group by
    l.ID,
    l.Name,
    l.Bought