【问题标题】:Getting 2019 results from query从查询中获取 2019 年结果
【发布时间】:2019-06-05 17:26:51
【问题描述】:

我有一个查询,它带来了三年(2016 年、2017 年和 2018 年)的结果,现在我需要包括第四年(2019 年),我不知道该怎么做。

我已尝试复制更改年份的部分查询,但出现了很多错误。

SELECT MAX(qnt2016) as qnt2016, MAX(qnt2017) as qnt2017, MAX(qnt2018) as qnt2018, empresa FROM
(SELECT CASE WHEN COUNT(cliente) IS NULL THEN 0
        ELSE COUNT(cliente) END AS qnt2016,  0 as qnt2017, 0 as qnt2018, empresa, rep
        FROM
        (SELECT E026RAM.CODRAM tipo, E026RAM.DESRAM nome, E085HCL.CODCLI cliente, E085HCL.CODREP rep, E090REP.APEREP empresa
        FROM
        E085HCL, E090REP, E085CLI, E026RAM, E070EMP, E007UFS
        WHERE
        ((E085CLI.SITCLI = 'A')) AND
        ((E026RAM.CODRAM in (1,2,3))) AND
        (((E085CLI.DATCAD >= '2000-01-01') AND (E085CLI.DATCAD <= '2016-12-31'))) AND
        ((E085HCL.CODEMP = 1)) AND
        ((E085CLI.SIGUFS = E007UFS.SIGUFS) AND 
         (E085HCL.CODREP = E090REP.CODREP) AND
        (E085CLI.CODRAM = E026RAM.CODRAM) AND 
        (E085HCL.CODCLI = E085CLI.CODCLI) AND 
        (E085HCL.CODEMP = E070EMP.CODEMP))) C2018
        where tipo not in (10, 15)
        GROUP BY rep, empresa

        union all

        SELECT  0 as qnt2016, CASE WHEN COUNT(cliente) IS NULL THEN 0
                ELSE COUNT(cliente) END AS qnt2017, 0 as qnt2018, empresa, rep
        FROM
        (SELECT E026RAM.CODRAM tipo, E026RAM.DESRAM nome, E085HCL.CODCLI cliente, E085HCL.CODREP rep, E090REP.APEREP empresa
        FROM
      E085HCL, E090REP, E085CLI, E026RAM, E070EMP, E007UFS
        WHERE
        ((E085CLI.SITCLI = 'A')) AND
       ((E026RAM.CODRAM in (1,2,3))) AND
        (((E085CLI.DATCAD >= '2000-01-01') AND (E085CLI.DATCAD <= '2017-12-31'))) AND
        ((E085HCL.CODEMP = 1)) AND
        ((E085CLI.SIGUFS = E007UFS.SIGUFS) AND 
         (E085HCL.CODREP = E090REP.CODREP) AND
        (E085CLI.CODRAM = E026RAM.CODRAM) AND 
        (E085HCL.CODCLI = E085CLI.CODCLI) AND 
        (E085HCL.CODEMP = E070EMP.CODEMP))) C2018
        where tipo not in (10, 15)
        GROUP BY rep, empresa

        union all

        SELECT 0 as qnt2016, 0 as qnt2017, CASE WHEN COUNT(cliente) IS NULL THEN 0
                ELSE COUNT(cliente) END AS qnt2018, empresa, rep
        FROM
        (SELECT
        E026RAM.CODRAM tipo, E026RAM.DESRAM nome, E085HCL.CODCLI cliente, E085HCL.CODREP rep, E090REP.APEREP empresa
        FROM
       E085HCL, E090REP, E085CLI, E026RAM, E070EMP, E007UFS
        WHERE
        ((E085CLI.SITCLI = 'A')) AND
        ((E026RAM.CODRAM in (1,2,3))) AND
        (((E085CLI.DATCAD >= '2000-01-01') AND (E085CLI.DATCAD <= '2018-12-31'))) AND
        ((E085HCL.CODEMP = 1)) AND
        ((E085CLI.SIGUFS = E007UFS.SIGUFS) AND 
         (E085HCL.CODREP = E090REP.CODREP) AND
        (E085CLI.CODRAM = E026RAM.CODRAM) AND 
        (E085HCL.CODCLI = E085CLI.CODCLI) AND 
        (E085HCL.CODEMP = E070EMP.CODEMP))) C2018
        where tipo not in (10, 15)
        GROUP BY rep, empresa, rep) select2
        GROUP BY empresa, rep
        order by rep"

【问题讨论】:

  • 我想您会像添加 2018 年数据一样添加 2019 年数据......只需更改日期即可。
  • 这个查询不是我建的,入队的时候已经在线了,做的人已经不在了
  • 那么这可能是修复它的好时机。似乎每年使用 UNION 并不是一个好方法。似乎做一个支点(也许是动态的)会简单得多。好吧,也许并不简单,但会消除不断更改查询以添加另一年数据的需要。
  • 我会阅读并提高我的技能,谢谢。

标签: sql sql-server database sql-server-2008


【解决方案1】:

您需要在关闭子查询之前添加另一个UNION ALL,并将新字段添加到所有SELECT 语句中

SELECT MAX(qnt2016) as qnt2016, MAX(qnt2017) as qnt2017, MAX(qnt2018) as qnt2018, MAX(qnt2019) as qnt2019, empresa FROM
               (SELECT CASE WHEN COUNT(cliente) IS NULL THEN 0
                ELSE COUNT(cliente) END AS qnt2016,  0 as qnt2017, 0 as qnt2018, 0 as qnt2019, empresa, rep
                                FROM
                ...
               union all

                SELECT 0 as qnt2016, 0 as qnt2017, , 0 as qnt2018, CASE WHEN COUNT(cliente) IS NULL THEN 0
                        ELSE COUNT(cliente) END AS qnt2019, empresa, rep
                FROM
                (SELECT
                E026RAM.CODRAM tipo, E026RAM.DESRAM nome, E085HCL.CODCLI cliente, E085HCL.CODREP rep, E090REP.APEREP empresa
                FROM
               E085HCL, E090REP, E085CLI, E026RAM, E070EMP, E007UFS
                WHERE
                ((E085CLI.SITCLI = 'A')) AND
                ((E026RAM.CODRAM in (1,2,3))) AND
                (((E085CLI.DATCAD >= '2000-01-01') AND (E085CLI.DATCAD <= '2019-12-31'))) AND
                ((E085HCL.CODEMP = 1)) AND
                ((E085CLI.SIGUFS = E007UFS.SIGUFS) AND 
                 (E085HCL.CODREP = E090REP.CODREP) AND
                (E085CLI.CODRAM = E026RAM.CODRAM) AND 
                (E085HCL.CODCLI = E085CLI.CODCLI) AND 
                (E085HCL.CODEMP = E070EMP.CODEMP))) C2018
                where tipo not in (10, 15)
                GROUP BY rep, empresa, rep) select2
                GROUP BY empresa, rep
                order by rep

我会回答您需要向查询中添加所需数据的内容,但正如 cmets 中所述,这是进行此查询的糟糕方式。阅读pivoting,我认为这是修改此查询的正确方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多