Sql 在同一查询中的不同筛选器上选择聚合

Sql 在同一查询中的不同筛选器上选择聚合,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,这是我的问题 SELECT client_id, TimesTested, CAST(COUNT(*) AS varchar(30)) AS count, CAST(AVG(testfreq) as varchar(30)) as TestFreq, CAST(STDEV(TestFreq) as varchar(30)) Stdv FROM counted GROUP BY client_id, TimesTested 它起作

这是我的问题

  SELECT
    client_id,
   TimesTested,
    CAST(COUNT(*) AS varchar(30)) AS count,
    CAST(AVG(testfreq) as varchar(30)) as TestFreq,
    CAST(STDEV(TestFreq) as varchar(30)) Stdv
  FROM counted
  GROUP BY
    client_id,
    TimesTested
它起作用了;但是,我需要过滤平均值和STDEV,其中testfreq>0,但我需要不过滤计数(*)

最接近的是:

  SELECT
    client_id,
   TimesTested,
    CAST(COUNT(*) AS varchar(30)) AS count,
    CAST(AVG(testfreq) as varchar(30)) as TestFreq,
    CAST(STDEV(TestFreq) as varchar(30)) Stdv
  FROM counted
  where testfreq>0  --however I don't want this filtered applied to count(*)
  GROUP BY
    client_id,
    TimesTested

非常感谢您的指导

您应该能够在聚合中使用类似以下内容的
CASE
语句:

SELECT client_id,
   TimesTested,
   CAST(COUNT(*) AS varchar(30)) AS count,
   CAST(AVG(case when testfreq>0 then testfreq end) as varchar(30)) as TestFreq,
   CAST(STDEV(case when testfreq>0 then TestFreq end) as varchar(30)) Stdv
FROM counted
GROUP BY client_id,  TimesTested
我不知道为什么需要将这些值作为varchar,是否有理由需要将这些值转换为
varchar

我只想让这些值保持原样:

SELECT client_id,
   TimesTested,
   COUNT(*) AS count,
   AVG(case when testfreq>0 then testfreq end) as TestFreq,
   STDEV(case when testfreq>0 then TestFreq end) Stdv
FROM counted
GROUP BY client_id,  TimesTested

为什么要将结果转换为字符串?测试频率的类型是什么?