【问题标题】:Querying parent category查询父类
【发布时间】:2016-03-18 04:38:40
【问题描述】:

我现在有以下查询:

 SELECT DISTINCT c.Name as CategoryName, SUM(Amount) OVER(partition by c.Name order by c.Name) as Total
    FROM Statements s
    LEFT JOIN Categories c on c.Id = s.CategoryId
    WHERE Date >= '2016-01-01'
    ORDER BY c.Name

到目前为止,它可以工作,并且可以获取每个类别的总数,但我需要的是以下内容。

类别可以有子类别。我想获取每一行的每个根类别及其所有子类别的总和。

表示 A 类有子 B 和 C。我想得到 Statements 中所有具有 A、B 或 C 类的条目的总和。

类别表由以下列组成:Id, Name, ParentId

语句表由以下列组成:Id, Date, Amount, CategoryId

表格类别的样本数据:

Id, Name, ParentId
1, A, null,
2, B, 1
3, C, 2
4, D, null

表Statements的样本数据

Id, Date, Amount, CategoryId
1, 2016-01-01, 100, 1
2, 2016-01-01, 200, 2
3, 2016-01-01, 800, 4
4, 2016-01-01, 300, 3

查询的输出应该如下:

CategoryName, Total
A, 600
D, 800

理想情况下,我可以将 parentCategoryId 传递到示例 null 中的 where 子句中,但也可以是 2。

任何提示表示赞赏:)

【问题讨论】:

  • 在不了解您的表结构的情况下无法回答这个问题。样本数据和预期输出也可能非常有用。你应该看看这个:stackoverflow.com/help/how-to-ask
  • @TomH 感谢您的输入,添加了示例数据。
  • Category 表中的ParentId 真的是类别名称吗?另外,类别树是只深一层还是子类别可以包含自己的子类别?
  • @TomH 不,它是类别的 ID。类别树实际上是无限深的
  • 你应该在问题中解决这个问题,因为你目前在该列中显示名称。

标签: sql sql-server sql-server-2008 sum


【解决方案1】:

一种常见的方法是使用递归 CTE 来构建层次结构..

;
WITH cte
AS (
    SELECT  [Id],
            [Name],
            [ParentId],
            [Name] AS [Root]
    FROM    Categories
    WHERE   ParentId IS NULL
    UNION ALL
    SELECT  c.[Id],
            c.[Name],
            c.[ParentId],
            [Root]
    FROM    Categories c
            JOIN cte ON c.ParentID = cte.Name
    )
SELECT  cte.[Root] AS [CategoryName],
        SUM(Amount) AS [Total]
FROM    cte
JOIN    Statements s ON s.CategoryId = cte.Id
GROUP BY cte.[Root]

【讨论】:

    【解决方案2】:

    这不是问题的答案(在我写这篇文章时,它缺乏关于如何在数据中描述父/子关系的足够信息)。但是,对于 OP 的既定目的,该查询并不是正确的查询。正确的查询是一个简单的聚合:

    SELECT c.Name as CategoryName, SUM(Amount) as Total
    FROM Table s LEFT JOIN
         Categories c 
         on c.Id = s.CategoryId
    WHERE Date >= '2016-01-01'
    GROUP BY c.Name
    ORDER BY c.Name;
    

    如果问题中的查询确实产生了有用的结果,我会感到非常惊讶,因为每个类别都有重复的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-28
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多