带有嵌套连接和总和的SQL

时间:2014-01-07 01:33:14

标签: sql sql-server

希望有人可以帮我查询一下我坚持的查询。 使用MS-Sql server 2012

这是一个更大的查询的一部分,但出于我的问题的目的,我只关注4个表:帐户,用户,产品,productstats

每个表格的简化布局如下:

account: id, parentaccountID, name
user: id, accountID, email
product: id, accountID
productstats: id, productID, views

因此,用户指向帐户表和帐户表的链接可以使用parentaccountID字段链接到自身。产品表链接到用户表,productstats表链接到产品表。

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的倍数

1 个答案:

答案 0 :(得分:1)

当你将查询分解成一些较小的部分时,它会变得更加清晰。

  1. 首先获取相关帐户
  2. 然后确定相关产品
  3. 然后才加入统计表以获取视图计数
  4. 看看这个sql fiddle

    [编辑]

    添加了一个new fiddle来表达您的意见。不再那么简单了,但我认为它能满足您的需求。