gpt4 book ai didi

sql-server - 我可以只使用 SQL 查询还是需要存储过程?

转载 作者:行者123 更新时间:2023-12-04 07:01:39 25 4
gpt4 key购买 nike

我遇到了一个问题,我需要一些建议/帮助。

背景:
我正在会计软件中编写 map ,该软件需要特殊格式和帐户代码之间的树状层次结构,即:

  • 账户 1 是账户 11、12 和 13 的父亲;
  • 另一方面,账户 11 是账户 111、112 和 113 的父亲;
  • 也可以有这样的账户关系:账户12是账户12111的父亲,因为没有121也没有1211,如果我自己说清楚,这意味着层次结构不是“一位数加层次结构”;
  • 这个逻辑一直持续到 map 的末尾。

  • 数据库表背景:
    整个过程涉及3个表。
  • 总账表( 名为 ContasPoc ),我可以通过每个科目代码将其与表 2(总账分录科目)相关联,换句话说,表 1 中的科目代码等于表 2( 此字段在两个表中都被命名为 CodigoConta )。
  • 总帐分录帐户( 名为 LancamentosContas ),正如我所说的,我可以将其与表 1(总帐)相关联。该表还通过 Id 与表 3(总分类帐条目)相关联。
  • 表 3 是我所说的总帐条目( 名为 Lancamentos )和 将此表与数字 2 相关联的字段名称是 IdLancamento .我需要这个表用于过滤目的。

  • 一个真实的例子:
    我想要从 24 到 26 的所有帐户都有值(value)观/ Action ,但我也想要他们的 parent 。此外,他们的 parent 必须包含他们 child 账户的总和,就像下面的示例输出:
    Account Code | Debit Sum | Credit Sum | Balance  /*Balance = Debit Sum - Credit Sum*/
    24 | 12,000 | 184,000 | -172,000 /*Sum of all children (242+243) */
    242 | 12,000 | 48,000 | -36,000 /*Sum of all children (2423+2424) */
    2423 | 12,000 | 0,000 | 12,000 /*Sum of all children (24231) */
    24231 | 0,000 | 0,000 | 12,000 /*Account with values/movements */
    2424 | 0,000 | 48,000 | -48,000 /*Sum of all children (24241) */
    24241 | 0,000 | 48,000 | -48,000 /*Account with values/movements */
    243 | 0,000 | 136,000 | -136,000 /*Sum of all children (2433) */
    2433 | 0,000 | 136,000 | -136,000 /*Sum of all children (24331) */
    24331 | 0,000 | 136,000 | -136,000 /*Sum of all children (243313) */
    243313 | 0,000 | 136,000 | -136,000 /*Account with values/movements */

    如您所见,有很多帐户,但只有具有以下评论的帐户 /*Account with values/movements*/有值,其他的都是我算出来的,这就给我带来了真正的问题:

    我可以做吗?当然,但目前我正在使用递归方法和几个查询来做到这一点,这种方法需要很多时间,所以我肯定需要一台新的,因为大多数客户使用旧电脑。

    我尝试使用带有 INNER JOINS 的查询来获取这种结构/数据。没有用,因为我没有得到我需要的所有数据,只有有 Action 的线条。

    我也尝试过使用 LEFT JOINS。效果不太好,因为我得到了我需要的所有数据以及很多我不需要的数据。但是使用 LEFT JOIN 还有一个问题,如果我没有在 WHERE 子句中包含表 3 中的任何字段,我只会得到这个额外的数据(也是我需要的数据)。这显然有一个答案,但因为我不是 SQL Server 方面的专家,所以我不知道这是什么原因。

    这是我构建的查询(另一个只有 1 个区别,一个 LEFT JOIN 而不是第一个 INNER JOIN):
    SELECT IdConta, Min(IdContaPai) AS IdContaPai, Min(ContasPoc.CodigoConta) AS CodigoConta
    FROM ContasPoc INNER JOIN (LancamentosContas INNER JOIN Lancamentos ON
    Lancamentos.IdLancamento = LancamentosContas.IdLancamento) ON ContasPoc.CodigoConta =
    LancamentosContas.CodigoConta
    WHERE Lancamentos.IdEmpresa=17 AND ContasPoc.IdEmpresa=17 AND Lancamentos.IdLancamento =
    LancamentosContas.IdLancamento AND ContasPoc.CodigoConta>='24' AND ContasPoc.CodigoConta<='26'
    GROUP BY IdConta
    ORDER BY Min(ContasPoc.CodigoConta)

    经过这么长的解释(很抱歉),我的 3 个问题是:
  • 是否有可能仅通过数据库查询获得这样的结果(如我上面所演示的),换句话说,不使用递归方法?
  • 如果不是(最有可能)是存储过程要走的路,如果是这样,我该怎么做(以前从未使用过它们)?
  • 还有我没有看到的另一种方法吗?

  • 有人可以帮我解决这个问题吗?

    我希望我得到了所有相关数据,但如果没有,请告诉我我忘记了什么,我很乐意回答。提前致谢!
    米格尔

    最佳答案

    WITH    q (AccountCode, Balance) AS (
    SELECT 24231, 12000
    UNION ALL
    SELECT 243313, -136000
    UNION ALL
    SELECT 24241, -48000
    UNION ALL
    SELECT 24, NULL
    UNION ALL
    SELECT 242, NULL
    UNION ALL
    SELECT 2423, NULL
    )
    SELECT qp.AccountCode, SUM(qc.Balance)
    FROM q qp
    JOIN q qc
    ON SUBSTRING(CAST(qc.AccountCode AS VARCHAR), 1, LEN(qp.AccountCode)) = qp.AccountCode
    GROUP BY
    qp.AccountCode
    ORDER BY
    AccountCode

    关于sql-server - 我可以只使用 SQL 查询还是需要存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1749986/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com