Sql server 在多对多表中计算行数

Sql server 在多对多表中计算行数,sql-server,count,aggregate,Sql Server,Count,Aggregate,请帮助我处理以下情况: 在SQL Server 2008中,我有一个包含以下表的数据库: 安装(id,name)对于给定系统是唯一的 安装在系统上的产品(Id,name) 由于一个系统有更多的产品,并且同一产品可以安装在多台机器上,因此有InstallationXProduct表及其ID 另一个表Usages(usageid、productid、date等)链接到产品,以跟踪产品的使用情况 我需要一个脚本来链接安装,产品和使用每个安装产品对的计数,例如 Installation 1 Prod

请帮助我处理以下情况:

在SQL Server 2008中,我有一个包含以下表的数据库:

  • 安装
    id,name
    )对于给定系统是唯一的
  • 安装在系统上的产品(
    Id,name
由于一个系统有更多的产品,并且同一产品可以安装在多台机器上,因此有
InstallationXProduct
表及其ID

另一个表
Usages
usageid、productid、date
等)链接到产品,以跟踪产品的使用情况

我需要一个脚本来链接
安装
产品
使用
每个
安装产品
对的计数,例如

Installation 1 Product A    2
Installation 1 Product B    3
Installation 2 Product A    1
Installation 2 Product C    2
谢谢你的帮助

稍后编辑:

表:

  • Installation
    InstallationID,InstallationName
  • 产品
    产品ID,产品名称
  • InstallationXProduct
    InstallationID,ProductID
  • 用法
    用法ID、日期记录、产品ID
设置数据:

Insert into Installation values(1,'A')
Insert into Installation values(2,'B')

Insert into Product values (1,'P1')
Insert into Product values (2,'P2')

Insert into InstallationXProduct values (1,1)
Insert into InstallationXProduct values (2,1)
Insert into InstallationXProduct values (1,2)
Insert into InstallationXProduct values (2,2)
Insert into Usage values(1,getdate(),1)
Insert into Usage values(2,getdate(),2)
Insert into Usage values(3,getdate(),1)
要选择的查询:

select I.InstallationID, P.ProductID, count(U.UsageID)
from Installation I 
join InstallationXProduct IXC on I.InstallationID = IXC.InstallationID
join Product P on P.ProductID = IXC.ProductID
join Usage U on U.ProductID = P.ProductID
group by I.InstallationId,P.ProductID
返回:

1   1   2
2   1   2
1   2   1
2   2   1

在阅读了这个浅显版本后,我想我理解了为什么不可能在产品和安装中划分使用情况,我无法判断使用情况是记录在产品1上的安装1还是记录在产品2上的

如果您需要计算
Usages
中的行数,那么类似的内容可能会有所帮助:

SELECT
    InstallationName = i.Name,
    ProductName = p.Name,
    UsageCount = COUNT(u.*)
FROM
    dbo.Installations i 
INNER JOIN
    dbo.InstallationXProduct ixp ON i.InstallationId = i.Id
INNER JOIN
    dbo.Product p ON ixp.ProductId = p.Id
INNER JOIN
    dbo.Usages u ON u.ProductId = p.Id
GROUP BY
    i.Name, p.Name

嗨,马克,谢谢你的回答。我尝试了只使用ID的脚本,但我得到了类似这样的副本(抱歉,我不知道如何格式化注释):5279118089 5299118089。所以问题是我得到的所有安装的使用次数都是一样的。18089是产品91的总使用量,但应在安装之间进行拆分。@Alex:您不能格式化注释-这就是为什么将代码或输出示例放入其中是一个非常糟糕的主意。尝试通过编辑问题来更新您的问题!查看您实际使用的查询会很有帮助。@Alex:另外,根据我从您最初的帖子中了解到的,
用法仅与产品相关-那么查询如何能够在安装之间“分割”这些用法呢???你能给出这些表的确切表结构吗?(请提供列名和数据类型)这正是您问题的核心所在—
用法
仅通过
ProductID
连接到产品—没有指向
安装
的链接,因此再多的SQL魔法也无法将这些用法在不同的安装之间分割开来。。。。。