如何将oracle中的解码功能转换为标准大查询

时间:2019-08-16 12:09:26

标签: sql oracle

有人可以帮助我将以下oracle代码转换为标准的大查询吗

SELECT
  Table1.BIC_ZC2ISBN10,
  sum ( decode(Table1.BIC_ZC2DCINDC,'H', (decode(Table1.BIC_ZC2MOVTYP,
       'Z03',Table1.BIC_ZK2CLABS2,
       'Z35',Table1.BIC_ZK2CLABS2,
       'Z64',Table1.BIC_ZK2CLABS2,
       'Z77',Table1.BIC_ZK2CLABS2,
        0)),0)   -  decode(Table1.BIC_ZC2DCINDC,'S', 
        (decode(BOADMIN.BIC_GM_AP2OINVS300_BO_VW.BIC_ZC2MOVTYP,
        'Z04',Table1.BIC_ZK2CLABS2,
        'Z36',Table1.BIC_ZK2CLABS2,
        'Z65',Table1.BIC_ZK2CLABS2,
         'Z78',Table1.BIC_ZK2CLABS2,
         0)),0) )
FROM
  Table1
GROUP BY
  Table1.BIC_ZC2ISBN10

我是大型查询的新手,对“解码”功能一无所知。

谢谢

3 个答案:

答案 0 :(得分:2)

可以使用CASE语句代替DECODE

CASE expr WHEN value THEN result [WHEN ...] [ELSE else_result] END

答案 1 :(得分:1)

由于@heregoes建议case when适用于大型查询,因此您可以使用以下查询。

SELECT
    TABLE1.BIC_ZC2ISBN10,
    SUM(CASE
        WHEN TABLE1.BIC_ZC2DCINDC = 'H' THEN CASE
            WHEN TABLE1.BIC_ZC2MOVTYP IN(
                'Z03', 'Z35', 'Z64', 'Z77'
            ) THEN TABLE1.BIC_ZK2CLABS2
            ELSE 0
        END
        ELSE 0
    END - CASE
        WHEN TABLE1.BIC_ZC2DCINDC = 'S'  THEN CASE
            WHEN BOADMIN.BIC_GM_AP2OINVS300_BO_VW.BIC_ZC2MOVTYP IN (
                'Z04',
                'Z36',
                'Z65',
                'Z78'
            ) THEN TABLE1.BIC_ZK2CLABS2
            ELSE 0
        END
        ELSE 0
    END
)
FROM TABLE1 
GROUP BY TABLE1.BIC_ZC2ISBN10;

干杯!

答案 2 :(得分:0)

您可以通过条件聚合来做到这一点。但是,您不需要嵌套的CASE表达式。实际上,您甚至不需要 multiple CASE表达式。一个就足够了:

SELECT t1.BIC_ZC2ISBN10,
       SUM(CASE WHEN t1.BIC_ZC2DCINDC = 'H' AND
                     t1.BIC_ZC2MOVTYP IN ('Z03', 'Z35', 'Z64', 'Z77')
                THEN t1.BIC_ZK2CLABS2
                WHEN t1.BIC_ZC2DCINDC = 'S' AND 
                     bg.BIC_ZC2MOVTYP IN ('Z04', 'Z36', 'Z65', 'Z78')
                THEN - t1.BIC_ZK2CLABS2
                ELSE 0
           END)
. . .

请注意,BOADMIN.BIC_GM_AP2OINVS300_BO_VW子句中未定义FROM。我为其定义了表别名bg,为第一个表定义了t1