SQL查询计数除以相同查询的不同计数

时间:2012-02-26 09:50:51

标签: sql oracle

遇到一些SQL问题。

例如,取以下结果:

LOC_CODE     CHANNEL            
------------ -------------------- 
3ATEST-01    CHAN2            
3ATEST-01    CHAN3            
3ATEST-02    CHAN4            

我需要做的是获取上述查询的计数,按通道分组,但我希望将该计数除以“LOC_CODE”出现的计数。

我所追求的结果示例是:

 CHANNEL          COUNT
 ---------------- ----------
 CHAN2            0.5
 CHAN3            0.5
 CHAN4            1

上面的解释是CHAN2出现在“3ATEST-01”旁边,但是“3ATEST-01”的LOC_CODE出现两次,所以计数应该除以2.

我知道我可以通过基本上使用不同的计数复制查询来实现此目的,但基础查询非常复杂,并不真正想损害性能。

如果您想了解更多信息,请与我们联系!

4 个答案:

答案 0 :(得分:4)

尝试:

select channel, 
       count(*) over (partition by channel, loc_code)
        / count(*) over (partition by loc_code) as count_ratio
from my_table

答案 1 :(得分:1)

SELECT t.CHANNEL, COUNT(*) / gr.TotalCount
FROM my_table t JOIN (
    SELECT LOC_CODE, COUNT(*) TotalCount
    FROM my_table
    GROUP BY LOC_CODE
) gr USING(LOC_CODE)
GROUP BY t.LOC_CODE, t.CHANNEL

(LOC_CODE, CHANNEL)

上创建索引

如果没有重复的渠道,请将COUNT(*) / gr.TotalCount替换为1 / gr.TotalCount并删除GROUP BY条款

答案 2 :(得分:1)

首先,找到一个可以获得正确结果的查询。然后,看看它是否可以优化。我的猜测很难优化,因为您需要两个不同的分组,一个Channel,一个Loc_Code

我甚至不确定这是否适合您的描述:

SELECT t.CHANNEL
     , COUNT(*) / SUM(grp.TotalCount)
FROM my_table t 
  JOIN 
      ( SELECT LOC_CODE
             , COUNT(*) TotalCount        --- or is it perhaps?:
                                          --- COUNT(DISTINCT CHANNEL)
        FROM my_table
        GROUP BY LOC_CODE
      ) grp 
     ON grp.LOC_CODE = t.LOC_CODE
GROUP BY t.CHANNEL

答案 3 :(得分:0)

当涉及到重复的CHANNEL时,您的要求对我来说仍然有点不清楚,但是如果您想要在CHANNEL和LOC_CODE上进行分组以便以后总结,那么这应该有用;

SELECT L1.CHANNEL, 1/COUNT(L2.LOC_CODE) 
FROM Locations L1
LEFT JOIN Locations L2 ON L1.LOC_CODE = L2.LOC_CODE 
GROUP BY L1.CHANNEL, L1.LOC_CODE

演示here