具有嵌套联接和和和的SQL

具有嵌套联接和和和的SQL,sql,sql-server,Sql,Sql Server,希望有人能给我一点帮助,回答我一直坚持的问题。 使用MS Sql server 2012 这是一个更大的查询的一部分,但就我的问题而言,我只关心4个表:Account、user、product和productstats 每个表的简化布局如下所示: account: id, parentaccountID, name user: id, accountID, email product: id, accountID productstats: id, productID, views 因此,用户

希望有人能给我一点帮助,回答我一直坚持的问题。 使用MS Sql server 2012

这是一个更大的查询的一部分,但就我的问题而言,我只关心4个表:Account、user、product和productstats

每个表的简化布局如下所示:

account: id, parentaccountID, name
user: id, accountID, email
product: id, accountID
productstats: id, productID, views
因此,用户可以通过parentaccountID字段链接到account表和account表。Product表链接到用户表,productstats表链接到Product表

productstats包含每个产品的统计信息。在我上面的例子中,我们知道有人看过一个产品多少次

我想得到每个父帐户下所有产品视图的总和,包括它的子帐户。但是,当人们搜索帐户时,他们可以通过account.name或user.email进行搜索

因此,如果他们通过user.email搜索,我希望包括该用户帐户中的所有产品,以及它所属的任何子帐户或父帐户

一个注意事项-父/子帐户结构只有1级深度。也就是说,账户要么是父账户,要么是子账户,两者都不是。父帐户的ParentAccountID值为空

SELECT a2.ParentAccountID, a.id, a.Name, SUM(ps.PageViews) 
FROM account a
LEFT JOIN account a2 ON a.id = a2.ParentAccountID
LEFT JOIN product p ON a.id = p.AccountID OR p.AccountID = a2.ID
LEFT JOIN ProductStatistic ps ON p.id = ps.ProductID                    
WHERE a.ame LIKE 'test'                  
GROUP BY a.id, a2.ParentAccountID, a.DealerName
这是查询的简化版本-我甚至还没有包括用户表,因为我还没有让它工作到现在

我在该查询中得到的值是: ParentAccountID=4,ID=4,name=test,sum=1617

当我运行以下查询时

SELECT SUM(pageviews) FROM ProductStatistic WHERE ProductID IN (
SELECT id FROM product WHERE AccountID IN (4, 32, 112, 3757, 3794))

我得到453作为结果-这些帐户ID是父帐户ID,它是4个子帐户。我不知道它是如何得到1617的,因为它甚至不是453的倍数。当你把你的查询分解成一些更小的部分时,它会变得更清晰

  • 首先获取相关账户
  • 然后确定相关产品
  • 只有加入stats表才能获得视图计数
  • 看看这个

    [编辑]


    添加了一个回复您评论的链接。不再那么简单了,但我认为它可以满足您的需要。

    删除分组,然后查看要返回的行。这可能有助于您自己调试。如果我删除group by并选择*,则会得到太多的记录。这些帐户的统计表中有375条记录-实际上,只有2个帐户有产品(4和32),但它返回了32个帐户的376条记录(只有4条记录),然后是其他3个子帐户的372条记录。显然,我把帐户表上的join搞砸了。我不知道如何纠正它虽然-我需要求助于使用临时表吗?谢谢你花时间这样做。不过,您的示例有一个小问题-每个家长可能有多个子代。还有一种可能,当有人搜索时,他们会返回多个帐户,因为我们允许部分匹配。我需要根据帐户ID而不是产品ID进行分组,因为我试图获取每个帐户的所有产品视图的总和,而不是每个项目的总和。我不知道如何找到所有相关的帐户ID,当他们可以使用user.email或account.name搜索时,并获得正确的无重复的金额。哦,然后事情会变得更复杂,我会写一个新的提琴谢谢-我会玩一下你发布的代码,看看这是否能满足我的需要。谢谢你花时间写这些。我很感激。