Teradata - 错误 2646 优化查询

Teradata - Error 2646 Optimization query

感谢您的回答!

这是一个编辑:

SELECT 'SYSA', 
   t1.lieu_stkph_cd, 
   Sum (t1.mt_pnu_cpta_dev_rep), 
   Sum (t2.mt_util_dev_rep) 
FROM   (SELECT a.id_auto, a.dt_art, c.lieu_stkph_cd, 
           a.mt_pnu_cpta_dev_rep 
    FROM   prod_v_ec_dossier_a_sysa c 
           INNER JOIN db_ftg_srs_prod_v.v_autorisation_a a 
                   ON a.id_doss = c.dosscta_no 
                      AND a.cd_prd_cpta = c.prct_no 
                      AND a.cd_entite_cpta = c.entite_cd 
    WHERE  c.pma_cd = '') AS t1
LEFT JOIN (SELECT a.id_auto, a.dt_art, c.lieu_stkph_cd, 
           b.mt_util_dev_rep 
    FROM   prod_v_ec_dossier_a_sysa c 
           INNER JOIN db_ftg_srs_prod_v.v_autorisation_a a 
                   ON a.id_doss = c.dosscta_no 
                      AND a.cd_prd_cpta = c.prct_no 
                      AND a.cd_entite_cpta = c.entite_cd 
           INNER JOIN db_ftg_srs_prod_v.v_utilisation_a b 
                      ON a.dt_art = b.dt_art 
                      AND a.id_auto = b.id_auto 
    WHERE  c.pma_cd = '') AS t2 
             ON  T1.id_auto = t2.id_auto 
            and T1.dt_art = T2.dt_art and t1.lieu_stkph_cd = t2.lieu_stkph_cd
GROUP  BY 1, 
          2

这是查询的结果:

LIEU_STKPH_CD PNU 金额 利用率
1 200 欧元 250 欧元

不准确,我解释一下:

db_ftg_srs_prod_v.v_autorisation_a 链接到 db_ftg_srs_prod_v.v_utilisation_a
- ID_AUTO
- DT_ART
但是我可以有 1 ID_AUTO 用于 X UTILISATION,所以对于这个查询,我将乘以 X 利用率 PNU 数量,这是不正确的

授权table

ID_AUTO PNU 数量
1 100 欧元

利用率table

ID_AUTO ID_UTLIZATION 利用率
1 1 100 欧元
1 2 150 欧元

所以我必须将这些值分开:

预期结果

LIEU_STKPH_CD PNU 金额 使用金额
1 100 欧元 250 欧元

你有什么想法吗?

提前致谢
克里斯托夫

您的第一个查询没问题,因为您这样做了

 SELECT ( select ... ) as field 1, 
        ( select ... ) as field 2, 

但是你第二次做的是交叉连接

 SELECT *
 FROM ( select ... ) as query1,
      ( select ... ) as query2

创建一个包含 query1 x query2 行的查询

你想要:

 SELECT query.*
 FROM ( SELECT ( select ... ) as field1,
               ( select ... ) as field2
        .....
      ) as query

在这里对您的数据关系进行大猜测。您应该使用带有 ON 的实际 JOIN 子句来加入,以解释如何将这两个子查询组合在一起。类似于:

SELECT 'SYSA', 
       t1.lieu_stkph_cd, 
       Sum (t1.mt_pnu_cpta_dev_rep), 
       Sum (t2.mt_util_dev_rep) 
FROM   (SELECT c.lieu_stkph_cd, 
               a.mt_pnu_cpta_dev_rep 
        FROM   prod_v_ec_dossier_a_sysa c 
               INNER JOIN db_ftg_srs_prod_v.v_autorisation_a a 
                       ON a.id_doss = c.dosscta_no 
                          AND a.cd_prd_cpta = c.prct_no 
                          AND a.cd_entite_cpta = c.entite_cd 
        WHERE  c.pma_cd = '') AS t1
   INNER JOIN (SELECT c.lieu_stkph_cd, 
               b.mt_util_dev_rep 
        FROM   prod_v_ec_dossier_a_sysa c 
               INNER JOIN db_ftg_srs_prod_v.v_autorisation_a a 
                       ON a.id_doss = c.dosscta_no 
                          AND a.cd_prd_cpta = c.prct_no 
                          AND a.cd_entite_cpta = c.entite_cd 
               INNER JOIN db_ftg_srs_prod_v.v_utilisation_a b 
                       ON a.dt_art = b.dt_art 
                          AND a.id_auto = b.id_auto 
        WHERE  c.pma_cd = '') AS t2 
    ON T1.lieu_stkph_cd = t2.lieu_stkph_cd
GROUP  BY 1, 
          2 

有几种方法可以去除相乘的值,例如加入前聚合

SELECT 'SYSA', 
   t1.lieu_stkph_cd, 
   t1.mt_pnu_cpta_dev_rep, 
   t2.mt_util_dev_rep 
FROM   (SELECT a.id_auto, a.dt_art, c.lieu_stkph_cd, 
           a.mt_pnu_cpta_dev_rep 
    FROM   prod_v_ec_dossier_a_sysa c 
           INNER JOIN db_ftg_srs_prod_v.v_autorisation_a a 
                   ON a.id_doss = c.dosscta_no 
                      AND a.cd_prd_cpta = c.prct_no 
                      AND a.cd_entite_cpta = c.entite_cd 
    WHERE  c.pma_cd = '') AS t1
LEFT JOIN (SELECT a.id_auto, a.dt_art, c.lieu_stkph_cd, 
           Sum(b.mt_util_dev_rep) AS mt_util_dev_rep 
    FROM   prod_v_ec_dossier_a_sysa c 
           INNER JOIN db_ftg_srs_prod_v.v_autorisation_a a 
                   ON a.id_doss = c.dosscta_no 
                      AND a.cd_prd_cpta = c.prct_no 
                      AND a.cd_entite_cpta = c.entite_cd 
           INNER JOIN db_ftg_srs_prod_v.v_utilisation_a b 
                      ON a.dt_art = b.dt_art 
                      AND a.id_auto = b.id_auto 
    WHERE  c.pma_cd = ''
    GROUP  BY 1, 
          2          ) AS t2 
             ON  T1.id_auto = t2.id_auto 
            AND T1.dt_art = T2.dt_art AND t1.lieu_stkph_cd = t2.lieu_stkph_cd

但似乎不需要连接两个派生表,这应该return相同的结果:

SELECT 'SYSA', 
   t1.lieu_stkph_cd, 
   -- this value is multiplied by the number of rows 
   -- so simply divide by that number to revert the multiplication 
   Sum (a.mt_pnu_cpta_dev_rep) / Count(*), 
   Sum (b.mt_util_dev_rep) 
FROM prod_v_ec_dossier_a_sysa c 
JOIN db_ftg_srs_prod_v.v_autorisation_a a 
  ON a.id_doss = c.dosscta_no 
AND a.cd_prd_cpta = c.prct_no 
AND a.cd_entite_cpta = c.entite_cd 
JOIN db_ftg_srs_prod_v.v_utilisation_a b 
  ON a.dt_art = b.dt_art 
 AND a.id_auto = b.id_auto 
WHERE  c.pma_cd = ''
GROUP  BY 1, 
          2