2012-07-27 66 views
4

总计数我有一个性能有很高的查询,过滤掉根据其它表等在分组TSQL查询

数据很多不需要的记录,我平均一列,也返回计数各均线组。这一切工作正常。

但是,我还想包括TOTAL计数的百分比。

有没有什么方法可以在不重新运行整个查询的情况下获得总计数,或者显着提高性能负载?

如果我不需要完全重构子查询(例如通过获取总数以外),我还会更喜欢,但如果需要可以做。

SELECT 
    data.EquipmentId, 
    AVG(MeasureValue) AS AverageValue, 
    COUNT(data.*) AS BinCount 
    COUNT(data.*)/ ???TotalCount??? AS BinCountPercentage 
FROM 
(SELECT * FROM MultipleTablesWithJoins) data 
GROUP BY data.EquipmentId 

回答

6

参见Window functions

SELECT 
    data.EquipmentId, 
    AVG(MeasureValue) AS AverageValue, 
    COUNT(*) AS BinCount, 
    COUNT(*)/ cast (cnt as float) AS BinCountPercentage 
FROM 
(SELECT *, 
     -- Here is total count of records 
     count(*) over() cnt 
FROM MultipleTablesWithJoins) data 
GROUP BY data.EquipmentId, cnt 

编辑:忘记做除法的数字。

+0

天才,工作一种享受!谢谢。 – 2012-07-27 11:51:52

+0

@PaulGrimshaw欢迎您:-) – 2012-07-27 11:52:10

1

另一种方法:

with data as 
(
    SELECT * FROM MultipleTablesWithJoins 
) 
,grand as 
(
    select count(*) as cnt from data 
) 
SELECT 
    data.EquipmentId, 
    AVG(MeasureValue) AS AverageValue, 
    COUNT(data.*) AS BinCount 
    COUNT(data.*)/ grand.cnt AS BinCountPercentage 
FROM data cross join grand 
GROUP BY data.EquipmentId 
+0

这看起来不错,但@NikolaMarkovinović建议的方法更好地插入到我现有的查询中。 (还是)感谢你的建议。 – 2012-07-27 12:22:39