2012-05-08 11 views
0

新しく作成した別名ABONOとCARGOに問題があります。結果の列名のALIASESとSQL照会はうまく動作しません "ABONO-CARGO AS AJUSTE" => Interbaseは列 "ABONO"を知らないというエラーを出します。間違って何Interbaseサブクエリで別名を正しく使用する

ABONO

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

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" 
+0

実際には、クエリ自体に単純なfield1-field2を実行する必要がありますか?あなたはあなたのアプリケーションの部分でそれをやりますか?私は知っているので、それはFireBirdの場合もあります – nawfal

+0

さて、私はC++ Builderでプログラミングしています。データソースとデータセットでTDBGrid(C++)コンポーネントを使用しています。私はデータセットに計算フィールドを追加することに困難を抱えていました。データセットの__onCalcFields__イベントは発生しませんので、私はDBにこの部分をさせ、料金と支払いとその合計を計算させることにしました。 –

答えて

2

簡潔に、多くのSQL DBMSで、選択リストに指定された列の別名がいなくても、選択リストの他の部分では、クエリの他の場所で使用することはできません。

レポートツールで計算を実行するか、値を取得するために2つのクエリを繰り返す必要があります(copy'n'pasteでも書き込むのは苦痛です。—)報告ツール)。

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を選択するべきだと思いますが、それはあなたの決断です。あなたが本当に区切られた識別子を本当に必要としているかどうかはわかりませんが、大部分はそのまま残してしまいました。

+0

優れたソリューションinfact! – nawfal

+0

Fireibrdで引用符付き識別子は、識別子がキーワードである場合、または大文字小文字を区別する識別子が必要な場合にのみ必要です。 –

+0

@ MarkRotteveel:その点で、Firebirdは標準SQLです。標準SQLでは、キーワード、大文字小文字を区別する識別子、または通常の識別子には使用できない文字(スペースやダッシュなど)を含む識別子の区切り識別子のみが必要です。 –

0

テーブル「cuentasSaldo」(CS)にABONOフィールドがあり、サブクエリの名前がABONOである必要があります。したがって、同じ名前の2つの「オブジェクト」があります。 フィールドをquery.fieldという形式で呼び出すことをお勧めします。 行6の例:ABONO-CARGO AS AJUSTE の代わりに を使用してください。CS.ABONO-CARGO AS AJUSTE

+0

ABONO/CARGOというフィールドはありません。 MOV_TIPOMOV: "A"または "C" =>これはあいまいな名前ではありませんが、とにかく感謝しています。 –

関連する問題