Sql :选择sum()作为子查询的查询
我有一个需要添加列的查询。我可以找到许多类似的例子,但没有什么适合这种情况。可能有无限个CategoryID,我需要添加按CategoryID分组的总和(IsOutage)。以下是一些示例数据: 这是我最接近于让它发挥作用的地方:Sql :选择sum()作为子查询的查询,sql,sql-server-2008,Sql,Sql Server 2008,我有一个需要添加列的查询。我可以找到许多类似的例子,但没有什么适合这种情况。可能有无限个CategoryID,我需要添加按CategoryID分组的总和(IsOutage)。以下是一些示例数据: 这是我最接近于让它发挥作用的地方: SELECT c.CategoryID , c.Name , COUNT(i.IssueID) AS TotalIssues , AVG(DATEDIFF(MI, i.StartDate, i.ResolvedDate)) AS AvgDuration ,(
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
我接近了吗?请提前通知我和thanx
编辑:这是一个模拟结果的样子:
您可以使用条件聚合。此外,您不应该按总停机进行分组
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
如果我正确理解您的需求,此查询将为您提供所需的结果:
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
如果你发布你想要的结果会更好,就像Eder和Darkloki展示了解决这个问题的最佳方法一样。只是由于
i.StatusID=3
,它们无法得到正确的结果。StatusID的含义是什么?出于这个目的,它是不相关的,可能已经被编辑掉了。。在我的实际场景中,它表示回复的状态为“已解决”Thanx,但无论回复的数据Thanx如何,总停机都返回“0”,但返回“0”对于总停机,不考虑data@Darkloki我已经根据您在另一个答案中给出的其他信息更新了查询…仍然返回TotalOutages中的所有0我应该注意到“IsOutage”是一个位列,这将导致“操作数数据类型bit对于sum运算符无效”。将sum语句更改为vkp的“case when IsOutage=1然后1 else 0 end”似乎是个好办法。Thnax为什么要在第二个派生表中使用窗口函数和DISTINCT
,而不仅仅是GROUP BY
。