subselect时的db2情况

时间:2012-11-12 16:06:40

标签: db2 case

我在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,以防情况或类似

的情况

谢谢

整个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

在                 dmzaposlenih.dmz_zaposleni = verzijaplaca.vpl_zaposleni

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

LEFT JOIN                 pet320.osnovnipodplace AS osnovnipodplace 上                 1 = 1

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

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

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

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

INNER JOIN                 pet320.verzijasumstavki AS verzijasumstavki 上           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或1 = 1)                 AND(verzijaplaca.vpl_strm_strmesta IS NULL或1 = 1)                 AND(dmzaposlenih.dmz_orgenote IS NULL或1 = 1)                 AND(dmzaposlenih.dmz_izplacilnamesta IS NULL或1 = 1)                 AND(verzijaplaca.vpl_placilnirazredi IS 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)

group by dmzaposlenih.dmz_enotezpiz,          zaposleni.za_koda

ORDER BY                 dmzaposlenih.dmz_enotezpiz,          zaposleni.za_koda

1 个答案:

答案 0 :(得分: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...不是一个有用的结构。关于如何设计更好的查询可能值得寻求帮助 - 我认为这可能会简单得多,但如果不知道你在做什么就很难说。