【问题标题】:Is there a way I can get a total from a SQL Query?有没有办法可以从 SQL 查询中获取总数?
【发布时间】:2018-03-02 22:58:27
【问题描述】:

这是我的查询:

SELECT CG.Id, CG.Name, CG.IsToggled, COUNT(*) AS TotalWordCount
FROM CategoryGroup AS CG
JOIN Category AS C ON CG.Id = C.GroupId
JOIN Phrase AS P ON C.Id = P.CategoryId
GROUP BY CG.Id
ORDER BY CG.Name

我需要做的是获取 TotalWordCount 列的总数其中 CG.IsToggled = 1

这是否可能在同一个查询中,或者有什么方法可以用两个查询来做到这一点。如果两个 SQL 语句的值与所有 TotalWordCount 加在一起的值相同,则它们是可以的。

【问题讨论】:

标签: sql sql-server


【解决方案1】:

我需要做的是获取 CG.IsToggled = 1 的 TotalWordCount 列的总数

您不能在同一个查询中进行总计(聚合的聚合)。但是,您可以在这样的子查询中执行此操作:

SELECT CG.Id, CG.Name, CG.IsToggled, SUM(c2.TotalWordCount) AS TotalWordCount
FROM CategoryGroup AS CG
INNER JOIN
( 
   SELECT Id, Name, COUNT(*) AS TotalWordCount
   FROM CategoryGroup
   WHERE IsToggled = 1
   GROUP BY Id, Name
) AS c2 ON c2.Id = CG.Id AND c2.Name = CG.Name
JOIN Category AS C ON CG.Id = C.GroupId
JOIN Phrase AS P ON C.Id = P.CategoryId
GROUP BY CG.Id, CG.Name, CG.IsToggled
ORDER BY CG.Name

请注意:您可能需要使用LEFT JOIN 来将带有IsToggled = 0 的人也包含在查询中:

SELECT CG.Id, CG.Name, CG.IsToggled, SUM(COALESCE(c2.TotalWordCount, 0)) AS TotalWordCount
FROM CategoryGroup AS CG
JOIN Category AS C ON CG.Id = C.GroupId
JOIN Phrase AS P ON C.Id = P.CategoryId
LEFT JOIN
( 
   SELECT Id, Name, COUNT(*) AS TotalWordCount
   FROM CategoryGroup
   WHERE IsToggled = 1
   GROUP BY Id, Name
) AS c2 ON c2.Id = CG.Id AND c2.Name = CG.Name
GROUP BY CG.Id, CG.Name, CG.IsToggled
ORDER BY CG.Name

【讨论】:

    【解决方案2】:

    你可以通过window function解决这个问题

    SELECT CG.Id, CG.Name, CG.IsToggled, COUNT(*) AS TotalWordCount,
        COUNT(*) OVER (PARTITION BY CG.id) as TotalTotalWordCount
    FROM CategoryGroup AS CG
    JOIN Category AS C ON CG.Id = C.GroupId
    JOIN Phrase AS P ON C.Id = P.CategoryId
    GROUP BY CG.Id
    ORDER BY CG.Name
    

    假设这实际上是 Microsoft SQL Server(这意味着发布的原始查询会出错,因为它在您的 GROUP BY 中没有 CG.Name)。

    【讨论】:

    • 对不起,我只是在问题中添加了一件小事。它需要在 IsToggled = 1 的位置。我希望这不会造成障碍
    • 完全没有障碍。 WHERE 子句非常适合添加到任一版本的查询中,因为它会在聚合和窗口函数逻辑命中之前被考虑在内。
    • 看不懂COUNT(*) OVER (PARTITION BY CG.id) as TotalTotalWordCount
    • 这个窗口函数说“根据共同的CG.id对记录进行分组,然后对每个组进行计数()”因此您将获得相同的计数() 对于共享相同id 的每条记录。我猜这也许不是你现在想要的,因为我写了这篇文章。 Count(*) OVER (PARTITION BY 1) 可能更有意义。
    猜你喜欢
    • 2015-01-26
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 2022-12-05
    • 2022-01-05
    相关资源
    最近更新 更多