首页 > 解决方案 > 不能混合聚合值和非聚合值

问题描述

我有一个表(table1),其中包含 3 个类别/子类别列、callID、客户端 ID 和持续时间。客户端 ID 可以重复(它们具有属于不同子类别的不同 callID)。

我有另一个具有唯一客户 ID 和 $amount 的表(table2)。

我希望使用 with 语句,其中的表显示唯一 ID 和 sum(duration) 作为 Totalduration(来自表 1)。然后选择 cat1, cat2, cat3, clientID, sum(duration), $amount*Totalduration/duration 两个表的内连接,按 1,2,3,4 分组

基本上,这将根据持续时间按比例计算 $amount。但这当然行不通,不能混合聚合和非聚合:(

请有关于如何做到这一点的任何提示/想法?

谢谢

编辑:

表格1:

Cat 1   Cat 2   Cat 3  CallID   Client ID  Duration
A       A       A      1        1          50
A       A       C      2        1          30
A       A       A      3        2          52
A       A       C      4        3          20
A       B       C      5        3          40
C       C       C      6        3          15
A       C       C      7        4          18
C       C       C      8        5          65
C       B       B      9        6          51

表 2:

Client ID    Cost
1            150
2            190
3            130
4            120
5            140
6            190

我正在尝试为 3 只猫的每个独特组合获取这个 Result_table:

Cat 1   Cat 2   Cat 3  Total Duration  Blended Cost
A       A       A      ...             ...
A       A       C      ...             ...
A       B       C      ...             ...
C       C       C      ...             ...
A       C       C      ...             ...
C       C       C      ...             ...
C       B       B      ...             ...

成本按唯一客户 ID 的持续时间按比例混合。例如,客户端 1 在 A/A/A 中的持续时间为 50 分钟,在 A/A/C 中为 30 分钟,成本为 150,在 Result_table 中,我们将为行 A/A/A 添加 50 分钟的总持续时间和 150* 30/(30+50) 混合成本。然后用同样的逻辑不断总结以下客户。

标签: sqlvertica

解决方案


我明白了。您试图将客户的成本分摊到各个类别中,然后按类别进行汇总。窗口功能!

select cat1, cat2, cat3, sum(duration),
       sum(cost * duration * 1.0 / client_duration) as blended_cost
from (select t1.*, t2.cost,
             sum(t1.duration) over (partition by t1.clientid) as client_duration
      from table1 t1 join
           table2 t2
           on t1.clientid = t2.clientid
     ) t1
group by cat1, cat2, cat3;

推荐阅读