繁体   English   中英

Select 特殊情况查询

[英]Select Distinct Case Query

我有以下查询

SELECT Distinct dbo.WSUS_ComputerUpdateStatusWithApprovals.fulldomainname AS [Computer Name]
  ,dbo.WSUS_ComputerUpdateStatusWithApprovals.title AS [Update Title]
  ,count((case when (DATEDIFF(day, [ArrivalDate], GetDate())) > '0' and (DATEDIFF(day, [ArrivalDate], GetDate())) < '31' Then '' End)) AS 'Green'
  ,count((case when (DATEDIFF(day, [ArrivalDate], GetDate())) > '31' and (DATEDIFF(day, [ArrivalDate], GetDate())) < '91' then '' End)) AS 'Yellow'
  ,count((case when (DATEDIFF(day, [ArrivalDate], GetDate())) > '90' then '' End)) AS 'Red'
  ,DATEDIFF(day, [ApprovalCreationDate], GetDate()) AS 'DaysOldSinceApproval'
FROM dbo.WSUS_ComputerUpdateStatusWithApprovals 
WHERE dbo.WSUS_ComputerUpdateStatusWithApprovals.IsApproved = 1 
Group by dbo.WSUS_ComputerUpdateStatusWithApprovals.fulldomainname 
,[ArrivalDate] 
,dbo.WSUS_ComputerUpdateStatusWithApprovals.ApprovalCreationDate
,dbo.WSUS_ComputerUpdateStatusWithApprovals.title
ORDER BY  dbo.WSUS_ComputerUpdateStatusWithApprovals.fulldomainname ASC

结果集如下所示:

结果

我希望它说计算机名称和每个绿色,黄色,红色的总数。 所以在这种情况下,计算机名称,绿色 = 3,黄色 = 1 和红色 = 1。我包括标题和天数以显示附加信息。

如果我正确地跟着你,你只需要更改group by子句,以便每个fulldomainname生成一行:

select 
    fulldomainname AS [Computer Name],
    sum(case when datediff(day, [ArrivalDate], GetDate()) between 1  and 30 then 1 else 0 end) AS Green,
    sum(case when datediff(day, [ArrivalDate], GetDate()) between 30 and 90 then 1 else 0 end) AS Yellow,
    sum(case when datediff(day, [ArrivalDate], GetDate()) > 90              then 1 else 0 end) AS Red
from dbo.WSUS_ComputerUpdateStatusWithApprovals 
where IsApproved = 1 
group by fulldomainname 
order by fulldomainname ASC

请注意,我将条件聚合逻辑更改为使用sum()而不是count() ,因为它似乎更容易理解。

暂无
暂无

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

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