1

我有一个返回以下数据集的查询:

设备 | 服务
----------------
PC1 | 服务1
PC1 | 服务2
PC1 | 服务3
PC1 | 服务4
PC1 | 服务5
PC1 | 服务6
PC1 | 服务7
电脑2 | 服务1
电脑2 | 服务2

我的报告中有一个表格,按设备分组并显示服务。但我还想要一个饼图,显示五种最常见的服务。

我可以使用第二个数据集和存储过程相当容易地做到这一点,但我想知道是否有一种方法可以使用同一个数据集来做到这一点(数据已经被查询并返回,所以在我看来它会比对服务器运行单独的程序性能更好)。

关于这是否可能的任何想法?或者我应该只使用第二个查询/存储过程?

4

2 回答 2

0

我假设您希望获得每组的计数,并且只显示前 5 名。您可以将 CTE 与COUNT(*)OVERand一起使用DENSE_RANK()OVER

WITH CTE AS
(
  SELECT Device, Service
   , COUNT(Service) OVER (PARTITION BY Device) AS Count
   , DENSE_RANK() OVER (PARTITION BY Device ORDER BY Service) AS Rank
  FROM tdevice
)
SELECT Count, Rank, Device, Service
FROM CTE
WHERE RANK <= 5

这是小提琴:http ://sqlfiddle.com/#!3/1f42a/8/

于 2012-09-11T07:05:26.393 回答
0

您可以使用嵌套查询。如果您从中提取的表的名称称为“#MYTABLE”,并且在上面的示例中返回了两列,那么您将使用

SELECT #MYTABLE.Device, #MYTABLE.Service, NUMBEROFINSTANCES FROM #MYTABLE
    LEFT JOIN
        (SELECT SERVICE, COUNT(DEVICE) AS NUMBEROFINSTANCES 
        FROM #MYTABLE
        GROUP BY SERVICE) AS ABB1 ON ABB1.SERVICE = #MYTABLE.SERVICE
于 2012-09-07T16:21:24.507 回答