0

新しく作成したエイリアス ABONO と CARGO に問題があります。"ABONO-CARGO AS AJUSTE" を計算しようとするまで、ALIASES (結果の列名) と SQL クエリは正常に機能します => Interbase は列 "ABONO" を認識しないというエラーを返します。

動的 SQL エラー SQL エラー コード = -206 列不明 ABONO

なにが問題ですか?

SELECT M."MOV_CUENTA",
       (SELECT SUM(MM."MOV_MONTO") 
          FROM "movimientos" MM
         WHERE MM."MOV_TIPOMOV" = 'A' AND MM."MOV_CUENTA" = CS."ID_CUENTAMUN"
         GROUP BY MM."MOV_CUENTA"
       ) AS ABONO,
       (SELECT SUM(XM."MOV_MONTO")
          FROM "movimientos" XM
         WHERE XM."MOV_TIPOMOV" = 'C' AND XM."MOV_CUENTA" = CS."ID_CUENTAMUN"
         GROUP BY XM."MOV_CUENTA"
       ) AS CARGO,
       ABONO-CARGO AS AJUSTE
  FROM "cuentasSaldo" CS
 INNER JOIN "movimientos" M ON (CS."ID_CUENTAMUN" = M."MOV_CUENTA")
 INNER JOIN "ajustes" AA ON (M."ID_AJUSTE" = AA."ID_AJUSTE")
 INNER JOIN "documentos" DD ON (AA."ID_DOCUMENTO" = DD."ID_DOCUMENTO")
 WHERE M."ID_AJUSTE" IN
           (SELECT A."ID_AJUSTE"
              FROM "ajustes" A
             WHERE A."ID_DOCUMENTO" IN
                     (SELECT D."ID_DOCUMENTO"
                        FROM "documentos" D
                       WHERE D."ID_EMPRESA" = 1 AND D."DOC_EDITABLE" = 1
                     )
           )
ORDER BY M."ID_AJUSTE", M."MOV_CUENTA"
4

2 に答える 2

2

簡潔に言うと、多くの SQL DBMS では、select-list で指定された列エイリアスは、select-list の他の部分であっても、クエリの他の場所では使用できません。

レポート ツールで計算を行うか、2 つのクエリを繰り返して値を取得する必要があります (これは、コピー アンド ペーストを使用しても、書くのが面倒です。優れたレポート ツールを使用するもう 1 つの理由です)。

SELECT M."MOV_CUENTA",
       (SELECT SUM(MM."MOV_MONTO") 
          FROM "movimientos" MM
         WHERE MM."MOV_TIPOMOV" = 'A' AND MM."MOV_CUENTA" = CS."ID_CUENTAMUN"
         GROUP BY MM."MOV_CUENTA"
       ) AS ABONO,
       (SELECT SUM(XM."MOV_MONTO")
          FROM "movimientos" XM
         WHERE XM."MOV_TIPOMOV" = 'C' AND XM."MOV_CUENTA" = CS."ID_CUENTAMUN"
         GROUP BY XM."MOV_CUENTA"
       ) AS CARGO,
       ((SELECT SUM(MM."MOV_MONTO") 
          FROM "movimientos" MM
         WHERE MM."MOV_TIPOMOV" = 'A' AND MM."MOV_CUENTA" = CS."ID_CUENTAMUN"
         GROUP BY MM."MOV_CUENTA"
       ) -
       (SELECT SUM(XM."MOV_MONTO")
          FROM "movimientos" XM
         WHERE XM."MOV_TIPOMOV" = 'C' AND XM."MOV_CUENTA" = CS."ID_CUENTAMUN"
         GROUP BY XM."MOV_CUENTA"
       )) AS AJUSTE
  FROM "cuentasSaldo" CS
 INNER JOIN "movimientos" M ON (CS."ID_CUENTAMUN" = M."MOV_CUENTA")
 INNER JOIN "ajustes" AA ON (M."ID_AJUSTE" = AA."ID_AJUSTE")
 INNER JOIN "documentos" DD ON (AA."ID_DOCUMENTO" = DD."ID_DOCUMENTO")
 WHERE M."ID_AJUSTE" IN
           (SELECT A."ID_AJUSTE"
              FROM "ajustes" A
             WHERE A."ID_DOCUMENTO" IN
                     (SELECT D."ID_DOCUMENTO"
                        FROM "documentos" D
                       WHERE D."ID_EMPRESA" = 1 AND D."DOC_EDITABLE" = 1
                     )
           )
ORDER BY M."ID_AJUSTE", M."MOV_CUENTA"

-それらの表現の中でその孤独を失うのはむしろ簡単です。

それを行う別の方法は次のとおりです。

SELECT "MOV_CUENTA", ABONO, CARGO, (ABONO - CARGO) AS AJUSTE
  FROM (SELECT M."ID_AJUSTE",
               M."MOV_CUENTA",
               (SELECT SUM(MM."MOV_MONTO") 
                  FROM "movimientos" MM
                 WHERE MM."MOV_TIPOMOV" = 'A' AND MM."MOV_CUENTA" = CS."ID_CUENTAMUN"
                 GROUP BY MM."MOV_CUENTA"
               ) AS ABONO,
               (SELECT SUM(XM."MOV_MONTO")
                  FROM "movimientos" XM
                 WHERE XM."MOV_TIPOMOV" = 'C' AND XM."MOV_CUENTA" = CS."ID_CUENTAMUN"
                 GROUP BY XM."MOV_CUENTA"
               ) AS CARGO
          FROM "cuentasSaldo" CS
         INNER JOIN "movimientos" M ON (CS."ID_CUENTAMUN" = M."MOV_CUENTA")
         INNER JOIN "ajustes" AA ON (M."ID_AJUSTE" = AA."ID_AJUSTE")
         INNER JOIN "documentos" DD ON (AA."ID_DOCUMENTO" = DD."ID_DOCUMENTO")
         WHERE M."ID_AJUSTE" IN
                   (SELECT A."ID_AJUSTE"
                      FROM "ajustes" A
                     WHERE A."ID_DOCUMENTO" IN
                             (SELECT D."ID_DOCUMENTO"
                                FROM "documentos" D
                               WHERE D."ID_EMPRESA" = 1 AND D."DOC_EDITABLE" = 1
                             )
                   )
       ) AS X
ORDER BY "ID_AJUSTE", "MOV_CUENTA"

ID_AJUSTE も選択する必要があると思いますが、それはあなたの判断です。これらの区切られた識別子が本当に必要かどうかもわかりませんが、ほとんど手を加えていません。

于 2012-05-08T17:42:24.803 に答える
0

テーブル「cuentasSaldo」(CS) にフィールド ABONO が必要であり、ABONO としてエイリアス化されたサブクエリがあります。したがって、同じ名前の 2 つの「オブジェクト」があります。query.field の形式でフィールドを呼び出すことをお勧めします。6 行目の例: instead of: ABONO-CARGO AS AJUSTE use: CS.ABONO-CARGO AS AJUSTE.

于 2012-05-08T19:42:28.123 に答える