簡體   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