1

我在 IBM DB2 上有以下 SQL 查询。

      SUM(CASE
              WHEN  verzijaplaca.vpl_vrsteplacila = 9150 THEN
                (select sum(verplaca.vpl_bruto) 
                        from pet320.verzijaplaca as verplaca
                       )    
              ELSE 0
            END) AS "brutoplacazaure"

内部选择有效,但是当我将它包含在 CASE 中时,它会报告错误。

错误:列函数的操作数无效。

DB2 SQL 错误:SQLCODE=-112,SQLSTATE=42607,SQLERRMC=null,DRIVER=3.57.91 错误代码:-112

如果我只跑

    SUM(CASE
              WHEN  verzijaplaca.vpl_vrsteplacila = 9150 THEN
                (1.0)   
              ELSE 0
            END) AS "brutoplacazaure"

有用

有什么建议么??似乎 DB 2 不支持内部 sql 以防 case 或 smth 这样

谢谢

整个sql查询如下

  SELECT
      zaposleni.za_koda AS "za_koda",
            MAX(enotezpiz.ezp_rsza) AS "ezp_rsza",
            MAX(zaposleni.za_polnoime) AS "za_polnoime",
            MAX(verzije.ve_datnamena) AS "ve_datnamena",
            MAX(verzije.ve_datizp) AS "ve_datizp",
            MAX(opp_telefonodgos) AS "opp_telefonodgos",
            MAX(pod_krajzaizpise ||', ') AS "pod_krajzaizpise",
            MAX(racuni.ra_stracuna) AS "ra_stracuna",
            MAX(racuni.ra_modul) AS "ra_modul",
            MAX(racuni.ra_sklstev) AS "ra_sklstev",
            MAX(verzije.ve_datizp) AS "ve_datizp",
            MAX(verzije.ve_naziv) AS "ve_naziv",
            SUM(CASE

                           WHEN vrsteplacila.vp_skupinevrpl in (1,2,3,4,16) and vrsteplacila.vp_udodatkov = 0 THEN verzijaplaca.vpl_eure
                           ELSE 0
            END) AS "mfure",

            MAX(dmzaposlenih.dmz_enotezpiz) AS "dmz_enotezpiz",

            (select  
                        SUM(olajsave.ozz_znesekolajsave) / 12
                           from 
                            pet320.olajsavedczaposlenih as olajsave
                           INNER JOIN 
                            pet320.verzije as verzija1
                           ON 
                            olajsave.ooz_datumod <= verzija1.ve_datkm AND (olajsave.ooz_datumdo IS NULL OR olajsave.ooz_datumdo >= verzija1.ve_datzm)
                           INNER JOIN 
                            pet320.zaposleni as zapp
                           ON 
                            olajsave.ozz_zaposleni = zapp.za_id_za
                           INNER JOIN
                            pet320.VERZIJAPLACA as vpl
                           ON
                           vpl.vpl_verzije = verzija1.ve_id_ve
                           AND zapp.za_id_za = vpl.vpl_zaposleni

                           where 
                            1=1

                           AND (vpl.vpl_vrsteplacila = 9150 OR vpl.vpl_skupinevrpl = 6)) AS "vz_znesvzddc",




            SUM(CASE
                           WHEN vrsteplacila.vp_skupinevrpl  = 3 AND vrsteplacila.vp_udodatkov = 0 THEN verzijaplaca.vpl_eure
                           WHEN vrsteplacila.vp_skupinevrpl  = 4 AND vrsteplacila.vp_udodatkov = 1 THEN verzijaplaca.vpl_eure
                           ELSE
                           0
            END) AS "bolovalure",


            SUM(CASE
                           WHEN vrsteplacila.vp_skupinevrpl = 4 AND vrsteplacila.vp_udodatkov = 0 THEN verzijaplaca.vpl_eure
                           ELSE
                           0
            END) AS "izostanekzdelaure",


            SUM(CASE
                           WHEN vrsteplacila.vp_skupinevrpl = 3 THEN verzijaplaca.vpl_bruto
                           ELSE
                           0
            END) AS "brutoznesekboleznine",


            SUM(CASE WHEN vrsteplacila.vp_skupinevrpl = 16 THEN verzijaplaca.vpl_bruto
                           ELSE
                           0
            END) AS "brutodopolnega",

            SUM(CASE WHEN vrsteplacila.vp_skupinevrpl = 16 and vrsteplacila.vp_udodatkov = 0 THEN verzijaplaca.vpl_eure
                           ELSE
                           0
            END) AS "uredopolenga",



            SUM(CASE
                           WHEN vrsteplacila.vp_skupinevrpl IN (16) THEN (verzijaplaca.vpl_bruto - verzijaplaca.vpl_neto)
                           ELSE
                           0
            END) AS "prispevkizasocvarnost",


            SUM(CASE
                           WHEN vrsteplacila.vp_skupinevrpl IN (16) THEN verzijaplaca.vpl_akdohod
                           ELSE
                           0
            END) AS "akdohodnine",
            SUM(CASE

当 verzijaplaca.vpl_skupinevrpl IN (16) 那么 verzijaplaca.vpl_neto - verzijaplaca.vpl_akdohod

                           ELSE
                           0
            END) AS "netonadomestilo",
            SUM(CASE WHEN  verzijaplaca.vpl_vrsteplacila = 9150 THEN
                (select sum(verplaca.vpl_bruto) 
                        from pet320.verzijaplaca as verplaca
                       INNER JOIN
                        pet320.verzije as ver
                        ON
                        ver.ve_id_ve = verplaca.vpl_verzije
                        INNER JOIN
                        pet320.zaposleni as zapo
                        ON
                        zapo.za_id_za = verplaca.vpl_zaposleni
                        AND ver.ve_id_ve = verplaca.vpl_verzije

                         where verplaca.vpl_vrsteplacila in (select vp_id_vp from pet320.vrsteplacila where vp_skupinevrpl in (1,2))
                          and verplaca.vpl_zaposleni = zapo.za_id_za
                          and verplaca.vpl_verzije = ver.ve_id_ve)  
              ELSE 0
            END) AS "brutoplacazaure"

  FROM
            pet320.verzijaplaca AS verzijaplaca

        INNER JOIN
                        pet320.vrsteplacila AS   vrsteplacila
        ON
                        verzijaplaca.vpl_vrsteplacila = vrsteplacila.vp_id_vp

        INNER JOIN
                        pet320.verzije AS verzije
        ON
                        verzijaplaca.vpl_verzije = verzije.ve_id_ve

        INNER JOIN
                        pet320.zaposleni AS zaposleni
        ON
                        verzijaplaca.vpl_zaposleni = zaposleni.za_id_za

        INNER JOIN
                        (SELECT
                                       a.*
                        FROM
                                       pet320.dmzaposlenih AS a
                        INNER JOIN
                                       (SELECT
                                                       dmz_zaposleni,
                                                       MAX(dmz_datumod) AS max_dmz_datumod
                                       FROM
                                                       pet320.dmzaposlenih
                                       GROUP BY
                                                       dmz_zaposleni) AS b
                        ON
                                       a.dmz_zaposleni = b.dmz_zaposleni
                                       AND a.dmz_datumod = b.max_dmz_datumod) as dmzaposlenih
        ON
                        dmzaposlenih.dmz_zaposleni = verzijaplaca.vpl_zaposleni

        INNER JOIN
                        pet320.enotezpiz AS enotezpiz
        ON
                        dmzaposlenih.dmz_enotezpiz = enotezpiz.ezp_id_ezp

        LEFT JOIN
                        pet320.osnovnipodplace AS osnovnipodplace
        ON
                        1=1

        INNER JOIN
                        pet320.racuni AS racuni
        ON
                        osnovnipodplace.opp_racuni = racuni.ra_id_ra

        INNER JOIN
                        pet320.podjetja AS podjetja
        ON
                        osnovnipodplace.opp_podjetja = podjetja.pod_id_pod

        LEFT JOIN
                        pet320.verzijazaposleni AS verzijazaposleni
        ON
                        verzijazaposleni.vz_zaposleni = zaposleni.za_id_za 
                        AND verzijazaposleni.vz_verzije = verzije.ve_id_ve

        INNER JOIN
                        pet320.verzijastrmesta as verzijastrmesta
        ON
                        verzijastrmesta.vs_verzije = verzije.ve_id_ve
                        AND verzijastrmesta.vs_strmesta = dmzaposlenih.dmz_strmesta
        INNER JOIN
                        pet320.verzijaorgenote AS verzijaorgenote
        ON
                        verzijaorgenote.vo_verzije = verzije.ve_id_ve
                        AND verzijaorgenote.vo_orgenote = dmzaposlenih.dmz_orgenote
        INNER JOIN
                        pet320.zaposinvalidi AS zaposinvalidi
        ON
                        zaposinvalidi.zi_zaposleni = verzijaplaca.vpl_zaposleni and zi_datdo is null

        INNER JOIN
                        pet320.verzijasumstavki AS verzijasumstavki
        ON
                  verzijasumstavki.vss_verzije = verzijaplaca.vpl_verzije AND
                  verzijasumstavki.vss_zaposleni = verzijaplaca.vpl_zaposleni AND
                  verzijasumstavki.vss_vrsteplacila = 9301


        WHERE
                        1=1
                        AND vrsteplacila.vp_skupinevrpl  in (1,2,3,4,16)
                        AND (verzijaplaca.vpl_verzije = 215)
                        AND (verzijaplaca.vpl_zaposleni  IS NULL OR 1=1)
                        AND (verzijaplaca.vpl_strm_strmesta  IS NULL OR 1=1)
                        AND (dmzaposlenih.dmz_orgenote  IS NULL OR 1=1)
                        AND (dmzaposlenih.dmz_izplacilnamesta  IS NULL OR 1=1)
                        AND (verzijaplaca.vpl_placilnirazredi  IS NULL OR 1=1)
                        AND (dmzaposlenih.dmz_vrstapog  IN (1,0))

            AND verzijaplaca.vpl_zaposleni in (select distinct vpl_zaposleni from pet320.verzijaplaca  where vpl_skupinevrpl = 16 AND vpl_verzije = 215)

        group by dmzaposlenih.dmz_enotezpiz,
                 zaposleni.za_koda


        ORDER BY
                        dmzaposlenih.dmz_enotezpiz,
                 zaposleni.za_koda

           INNER JOIN
            (SELECT
                           a.*
            FROM
                           pet320.dmzaposlenih AS a
            INNER JOIN
                           (SELECT
                                           dmz_zaposleni,
                                           MAX(dmz_datumod) AS max_dmz_datumod
                           FROM
                                           pet320.dmzaposlenih
                           GROUP BY
                                           dmz_zaposleni) AS b
            ON
                           a.dmz_zaposleni = b.dmz_zaposleni
                           AND a.dmz_datumod = b.max_dmz_datumod) as dmzaposlenih

ON dmzaposlenih.dmz_zaposleni = verzijaplaca.vpl_zaposleni

内连接 pet320.enotezpiz AS enotezpiz ON dmzaposlenih.dmz_enotezpiz = enotezpiz.ezp_id_ezp

左加入 pet320.osnovnipodplace 作为 osnovnipodplace ON 1=1

INNER JOIN pet320.racuni AS racuni ON osnovnipodplace.opp_racuni = racuni.ra_id_ra

INNER JOIN pet320.podjetja AS podjetja ON osnovnipodplace.opp_podjetja = podjetja.pod_id_pod

左连接 pet320.verzijazaposleni AS verzijazaposleni ON verzijazaposleni.vz_zaposleni = zaposleni.za_id_za AND verzijazaposleni.vz_verzije = verzije.ve_id_ve

INNER JOIN pet320.verzijastrmesta as verzijastrmesta ON verzijastrmesta.vs_verzije = verzije.ve_id_ve AND verzijastrmesta.vs_strmesta = dmzaposlenih.dmz_strmesta INNER JOIN pet320.verzijaorgenote AS verzijaorgenote ON verzijaorgenote.vo_verzije = verzije.ve_id_ve AND verzijaorgenote.vo_orgenote = dmzaposlenih.dmz_orgenote INNER JOIN pet320. zaposinvalidi AS zaposinvalidi ON zaposinvalidi.zi_zaposleni = verzijaplaca.vpl_zaposleni 和 zi_datdo 为空

INNER JOIN pet320.verzijasumstavki AS verzijasumstavki ON verzijasumstavki.vss_verzije = verzijaplaca.vpl_verzije AND verzijasumstavki.vss_zaposleni = verzijaplaca.vpl_zaposleni AND verzijasumstavki.vss_vrsteplacila = 9301

WHERE 1=1 AND vrsteplacila.vp_skupinevrpl in (1,2,3,4,16) AND (verzijaplaca.vpl_verzije = 215) AND (verzijaplaca.vpl_zaposleni IS NULL OR 1=1) AND (verzijaplaca.vpl_strm_strmesta IS NULL OR 1= 1) AND (dmzaposlenih.dmz_orgenote 为 NULL 或 1=1) AND (dmzaposlenih.dmz_izplacilnamesta 为 NULL 或 1=1) AND (verzijaplaca.vpl_placilnirazredi 为 NULL 或 1=1) AND (dmzaposlenih.dmz_vrstapog IN (1,0))

AND verzijaplaca.vpl_zaposleni in (select distinct vpl_zaposleni from pet320.verzijaplaca  where vpl_skupinevrpl = 16 AND vpl_verzije = 215)

由 dmzaposlenih.dmz_enotezpiz、zaposleni.za_koda 组

由 dmzaposlenih.dmz_enotezpiz、zaposleni.za_koda 订购

4

1 回答 1

1

您尝试编写的查询将运行

select sum(verplaca.vpl_bruto) 
    from pet320.verzijaplaca as verplaca

并在每次case陈述为真时产生完全相同的结果。即使您可以这样做,也不应该这样做,因为一遍又一遍地运行该查询会浪费大量时间。相反,运行该语句一次并存储该值。然后在需要时参考存储的值。这里有几个选项:

with vpl_bruto_sum as (
     select sum(verplaca.vpl_bruto) as total
        from pet320.verzijaplaca as verplaca
)
select sum(case when verzijaplaca.vpl_vrsteplacila = 9150 
               then vpl_bruto_sum.total else 0 
           end
       )
    from pet320.verzijaplaca
    inner join vpl_bruto_sum on 1=1;

或者,您可以通过使用连接条件而不是内部 case 语句来简化思考:

with vpl_bruto_sum as (
     select sum(verplaca.vpl_bruto) as total
        from pet320.verzijaplaca as verplaca
)
select sum(vpl_bruto_sum.total)
    from pet320.verzijaplaca
    left outer join vpl_bruto_sum on verzijaplaca.vpl_vrsteplacila = 9150;

如果你想计算一个值,然后在多个不同的查询中使用它,你可以使用一个变量:

create or replace variable my_sum integer;
set my_sum = (select sum(vpl_bruto) from pet320.verzijaplaca);

select sum(case when verzijaplaca.vpl_vrsteplacila = 9150 
               then my_sum else 0 
           end
       )
    from pet320.verzijaplaca;

希望这将帮助您入门。

看起来您的查询可能还有其他问题。例如,where 1=1 and...不是一个有用的构造。关于如何设计更好的查询可能值得寻求帮助——我认为它可能会简单得多,尽管在不知道你在做什么的情况下很难说。

于 2012-11-13T12:03:58.900 回答