0

我想加入一个带有大结果集(+ 6M 行)的表。

我有下表

时期 标签 姓名 程序 成本
2020-10-01 欧洲、中东和非洲 一个 用户 2 节目二 98
2020-11-01 亚太地区 一个 用户 2 节目二 103
2020-12-01 不适用 一个 用户 2 节目二 118
2020-10-01 不适用 X 用户 3 方案 3 334
2020-11-01 欧洲、中东和非洲 X 用户 3 方案 3 362
2020-12-01 亚太地区 X 用户 3 方案 3 380

我想要一个具有这种输出的高效查询(我不介意没有值可以是 0 或 null):

时期 标签 姓名 程序 成本 成本欧洲、中东和非洲 亚太地区成本 成本不适用
2020-10-01 欧洲、中东和非洲 一个 用户 2 节目二 98 98 0 0
2020-11-01 亚太地区 一个 用户 2 节目二 103 0 103 0
2020-12-01 不适用 一个 用户 2 节目二 118 0 0 118
2020-10-01 不适用 X 用户 3 方案 3 334 0 0 334
2020-11-01 欧洲、中东和非洲 X 用户 3 方案 3 362 362 0 0
2020-12-01 亚太地区 X 用户 3 方案 3 380 0 380 0

如果我执行以下查询,则需要很长时间:

WITH TOTAL AS (
SELECT Period,Zone,TAG,NAME,PROGRAM,COST
FROM "DB"."SCHEMA"."Table"
)
SELECT T.*,E."COST" AS "COST EMEA",A."COST" AS "COST APAC",N."COST" AS "COST NA"
FROM TOTAL T , TOTAL E, TOTAL A, TOTAL N
WHERE T."Period" = E."Period" 
AND T."Period" = A."Period"
AND T."Period" = N."Period" 

我该如何改进这个查询?有一种有效的方法来执行它吗?

4

1 回答 1

2

您的查询将需要很长时间才能运行,因为它正在对周期 ID 相同的行进行笛卡尔积 3 次(3 次连接)。我认为它也会产生错误的结果。

如果我正确理解您的问题,我认为您正在寻找这样的东西:

WITH TOTAL AS (
    SELECT
        Period,
        Zone,
        TAG,
        NAME,
        PROGRAM,
        COST
    FROM test_table
)
SELECT
    total.*,
    iff(upper(zone) = 'EMEA', cost, 0) as COST_EMEA,
    iff(upper(zone) = 'APAC', cost, 0) as COST_APAC,
    iff(upper(zone) = 'NA', cost, 0) as COST_NA
from total
;

这会产生下表(我认为您的示例结果不正确。表的最后一行将成本与NA应该在的位置相关联APAC。):

时期 标签 姓名 程序 成本 COST_EMEA COST_APAC COST_NA
2020-10-01 欧洲、中东和非洲 一个 用户 2 节目二 98 98 0 0
2020-11-01 亚太地区 一个 用户 2 节目二 103 0 103 0
2020-12-01 不适用 一个 用户 2 节目二 118 0 0 118
2020-10-01 不适用 X 用户 3 方案 3 334 0 0 334
2020-11-01 欧洲、中东和非洲 X 用户 3 方案 3 362 362 0 0
2020-12-01 亚太地区 X 用户 3 方案 3 380 0 380 0
于 2021-04-06T13:28:46.293 回答