从两个分组中获取价值

时间:2018-11-19 14:53:29

标签: sql sql-server

所以我有一个500行的查询,我将尝试在一个简单的查询中进行总结:

SELECT 
   max(t.USER_ID)
  ,max(t.OFFICE_ID)
  ,COUNT(CASE WHEN t.VALUE > 10 THEN 1 ELSE 0 END)
  /COUNT(t.VALUE) as Value_Avg

FROM(
   SELECT
     p.USER_ID
    ,c.OFFICE_ID
    ,h.VALUE
    , ... etc (Join, Where, ...)
   ) t
GROUP BY t.USER_ID

类似的查询将给出以下结果:

USER_ID   OFFICE_ID   Value_Avg
1001      100         0.8
1002      100         0.75
1010      200         0.50

基本上按用户显示大于10的值的百分比。

现在,假设用户1001有20条日志,用户1002有10条日志,而我也想按部门平均取第4列,那么如果我只能按一组使用,我该怎么做呢? / p>

2 个答案:

答案 0 :(得分:1)

您似乎想要:

SELECT p.USER_ID, c.OFFICE_ID,
       AVG(CASE WHEN t.Value > 10 THEN 1.0 ELSE 0 END) as value_avg
FROM . . .
GROUP BY p.USER_ID, c.OFFICE_ID;

您不需要子查询。假设Value从未为NULL。如果是这样,则将表达式更改为:

       AVG(CASE WHEN t.Value > 10 THEN 1.0
                WHEN t.Value IS NOT NULL THEN 0
           END) as value_avg

答案 1 :(得分:1)

您需要在单独的查询中计算部门平均值。然后与您当前的查询一起添加部门平均值

WITH dept as (
   SELECT t.OFFICE_ID,
          COUNT(CASE WHEN t.VALUE > 10 THEN 1 ELSE 0 END)
        / COUNT(t.VALUE) as dept_Avg
   FROM ( ... ) t
   GROUP BY t.OFFICE_ID
)
SELECT 
    max(t.USER_ID)
  , max(t.OFFICE_ID)
  , COUNT(CASE WHEN t.VALUE > 10 THEN 1 ELSE 0 END)
   / COUNT(t.VALUE) as Value_Avg    
  , MAX( d.dept_Avg ) as dept_Avg
FROM ( ... ) t
JOIN dept d
  ON t.OFFICE_ID = d.OFFICE_ID
GROUP BY t.USER_ID