【发布时间】:2018-12-28 14:26:53
【问题描述】:
我正在尝试通过整个 s_date/part_no 分组,从结果 CASE 语句中填充具有相同结果值的列。
我们已经尝试了多种不同的路线来让递归来满足我们的需要,但都没有成功。计算非常棘手,而且我们知道 SQL 不是递归的最佳选择,因此我们正在尝试寻找替代路线,暂时满足客户需求和时间紧迫。
SELECT
s_date,
part_no,
i_group,
s_level,
p_category,
qty_filled,
qty_total,
relief_amt,
extreme_amt,
curr_mth_note,
CASE
WHEN curr_mth_note IS NOT NULL
AND i_group = '1'
AND s_level = '80' THEN qty_filled
ELSE NULL
END AS g1s1_filled
FROM
(
SELECT
t1.s_date,
t1.part_no,
t1.i_group,
t1.s_level,
t1.p_category,
t1.qty_filled,
t1.qty_total,
mv.relief_amt,
mv.extreme_amt,
mv.curr_mth_note,
FROM
multi_table mv,
t_table t1
WHERE
t1.part_no = mv.part_no
AND mv.part_no = 'xxxx'
AND t1.s_date = mv.s_date
AND t1.s_date = '201805'
GROUP BY
t1.s_date,
t1.i_group,
t1.s_level,
t1.part_no,
t1.p_category,
t1.qty_filled,
t1.qty_total,
mv.relief_amt,
mv.extreme_amt,
mv.curr_mth_note,
ORDER BY
t1.s_date,
t1.i_group,
t1.s_level DESC
)
ORDER BY
s_date,
part_no,
i_group,
DECODE(s_level, '80', 1, '100', 2, 'Late', 3)
上面的当前输出如下所示:
我正在尝试/希望得到的是整个 g1s1_filled 列显示相同的 67 数量,其中 i_group = '1' and s_level = '80' 用于所有可用的日期/部分组合。
所以要让该列显示:
G1S1_FILLED
67
67
67
67
67
我研究了如何尝试使用 where 而不是 when,但没有运气。 还会有多个像这样构建的其他列,我最终也可以在其中进行计算。
【问题讨论】:
-
在您的示例数据中,只有一条记录满足
i_group = '1'和s_level = '80'的条件,g1s_filled的值为 67。所以我很难看到问题。 -
@RyanWilson 是的,我知道,但我将为每个 i_group / s_level 组合进行单独计算,这必须基于之前的总数,具体取决于relief_amt 列中剩余的内容。因此,我尝试垂直填充相同的值,以便让这些计算按预期工作。
-
如果
s_date/part_no组合有多个 1/80 行怎么办 - 您将如何选择要使用的qty_filled值中的哪一个? (或者这四列是否形成一个复合键,这样就不会发生?) -
@AlexPoole 这不会发生,因为日期/部分/组/级别组合数量已经在其他视图中计算,并被拉入此处,因此我们可以将它们单独用于报告.