对每个唯一 ID 的值求和一次的列,同时按类型进行筛选(Oracle 融合运输智能)



我意识到这之前已经讨论过,但在一个简单的 CASE 表达式中看到用于在 Oracle FTI 中添加列的解决方案 - 不幸的是,就我目前的经验而言。我的最终目标是为每个类别提供一个总权重,只计算空类型条目,每个 ID 只有一个权重(不知道为什么选择 null 作为默认类型)。我需要按类型将数据分解为工作正常的总成本列,所以我没有将其包含在下面的示例数据中,但由于我必须按类型分解数据,所以我在消除总重量结果中的冗余值时遇到了问题。

我包含冗余权重的原始列如下:

SUM(CASE Type
WHEN null
THEN 'Weight'
ELSE null 
END)

一些附加信息:

  • 每个 ID 可以有多个类型(此外,每个 ID 可能并不总是具有 A 或 B,但应始终具有 null)
  • 每个 ID 只能有一个权重(但是当按类型分解时,该值只会重复并弄乱结果)
  • 每个 ID 只能有一个类别(这并不重要,因为我已经在结果中用类别列将其分开)

示例数据:

ID |Categ. |Type | Weight 1 | Old | A | 1600 1 | Old | B | 1600 1 | Old |(null) | 1600 2 | Old | B | 400 2 | Old |(null) | 400 2 | Old |(null) | 400 3 | New | A | 500 3 | New | B | 500 3 | New |(null) | 500 4 | New | A | 500 4 | New |(null) | 500 4 | New |(null) | 500

期望的结果: Categ. | Total Weight Old | 2000 New | 1000

我试图弄清楚如何在列中包含基于 ID 的 DISTINCT,但是当我将 DISTINCT 放在 CASE 前面时,它只是消除了多余的权重,所以我只会得到 500 的总重量新。

此外,我认为可以在聚合权重之前将权重除以权重计数,但这似乎也不起作用:

SUM(CASE Type
WHEN null
THEN 'Weight'/COUNT(CASE Type
                    WHEN null
                    THEN 'Weight'
                    ELSE null
                    END)
ELSE null 
END)

我非常感谢可以提供的任何帮助,请让我知道是否有一种简单的方法来创建达到预期结果的列。 很明显,我对 Oracle 很陌生,所以如果需要任何其他信息,请告诉我。

谢谢将

这里不需要案例陈述。您在 distinct 上走在正确的轨道上,但您还需要使用 inline view(来自 caluse 中的子查询)。

from 子句中的子查询,选择 (id、categ、weight) 的所有不同组合,允许您从结果集中选择,从而仅选择 categ、权重总和、按 categ 分组。from 子句中的子查询对于给定的 id 没有重复的权重(与表本身不同,这就是需要这样做的原因)。

如果一个 id 有多个类别,则必须以稍微不同的方式完成此操作,但您注意到一个 id 只有一个类别。

select categ,
       sum(weight)
  from (select distinct id,
                        categ,
                        weight
          from tbl)
 group by categ;

小提琴:http://sqlfiddle.com/#!4/11a56/1/0

最新更新