繁体   English   中英

: 选择以 sum() 作为子查询的查询

[英]: Select query with sum() as subquery

我有一个需要添加一列的查询。 我可以找到许多类似的例子,但没有什么适合这种情况。 可能有无限的 CategoryID,我需要添加按 CategoryID 分组的 Sum(IsOutage)。 这是一些示例数据:

在此处输入图片说明

这是我最接近它的工作:

SELECT     c.CategoryID
, c.Name
, COUNT(i.IssueID) AS TotalIssues
, AVG(DATEDIFF(MI, i.StartDate, i.ResolvedDate)) AS AvgDuration
,(Select COUNT(h.IssueID) From dbo.hdIssues AS h Where h.CategoryID = i.CategoryID AND IsOutage = 1 ) AS TotalOutages

FROM         dbo.hdCategories AS c INNER JOIN
                  dbo.hdIssues AS i ON c.CategoryID = i.CategoryID
WHERE     (i.StatusID = 3)
GROUP BY c.CategoryID, c.Name, TotalOutages

我很亲近吗? 请提前告知并感谢

编辑:这是结果应该是什么样子的模拟:

在此处输入图片说明

如果我正确理解您的需求,这个查询应该会给您想要的结果:

SELECT  x.* ,
        y.SumIsOutage

FROM    (SELECT c.CategoryID ,
                c.Name ,
                COUNT(i.IssueID) AS TotalIssues ,
                AVG(DATEDIFF(MI, i.StartDate, i.ResolvedDate)) AS AvgDuration
        FROM    dbo.hdCategories AS c 
                INNER JOIN  dbo.hdIssues AS i ON c.CategoryID = i.CategoryID
        WHERE     (i.StatusID = 3)
        GROUP BY c.CategoryID, c.Name ) x
        LEFT JOIN   (SELECT DISTINCT i.CategoryId,
                    SUM(CONVERT(INT,i.isOutage)) OVER (PARTITION BY i.CategoryId) AS SumIsOutage
                    FROM dbo.hdIssues AS i ) y
        ON x.CategoryId = y.CategoryId

您可以使用条件聚合。 此外,您不应该group by停电进行分组

SELECT    
c.CategoryID
, c.Name
, COUNT(i.IssueID) AS TotalIssues
, AVG(DATEDIFF(MI, i.StartDate, i.ResolvedDate)) AS AvgDuration
,sum(case when IsOutage = 1 then 1 else 0 end) AS TotalOutages
FROM dbo.hdCategories AS c INNER JOIN
dbo.hdIssues AS i ON c.CategoryID = i.CategoryID
WHERE i.StatusID = 3
GROUP BY c.CategoryID, c.Name

对于此计数,您不需要另一个子查询。 只需计算您感兴趣的行:

COUNT(CASE WHEN i.IsOutage = 1 THEN 1 END)

在您的查询上下文中:

SELECT     
  c.CategoryID
, c.Name
, COUNT(i.IssueID) AS TotalIssues
, AVG(DATEDIFF(MI, i.StartDate, i.ResolvedDate)) AS AvgDuration
, COUNT(CASE WHEN CONVERT(INT, i.IsOutage) = 1 THEN 1 END) AS TotalOutages
FROM 
  dbo.hdCategories AS c 
INNER JOIN
  dbo.hdIssues AS i 
    ON c.CategoryID = i.CategoryID
WHERE 
  i.StatusID = 3
GROUP BY 
  c.CategoryID
, c.Name

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM