0

次のクエリがあります。

select
   AD.ALLOCATION_INSTR_ID AS "Allocation Id"
  ,AD.ALLOCATION_INSTR_VERSION AS "Allocation Version"
  ,SUM(AC.CHARGE_AMOUNT) AS "Allocation Commission"
  ,AD.ALLOCATION_ID AS "Sub Allocation Id"
  ,AD.ALLOCATION_VERSION AS "Sub Allocation Version"
  ,AC.CHARGE_AMOUNT AS "Allocation Commission"
  ,B.BLOCK_ID AS "Block Id"
  ,B.BLOCK_VERSION AS "Block Version"
  ,B.BLOCK_SOURCE_SYSTEM AS "Block Source System"
  ,BC.CHARGE_AMOUNT AS "Block Commission"
FROM  EQ_MO_ALLOCATION_DETAIL AS AD 
  LEFT OUTER JOIN EQ_MO_ALLOCATION_DETAIL_CHARGE AS AC 
      ON AC.ALLOCATION_DETAIL_OID = AD.ALLOCATION_DETAIL_OID 
  JOIN EQ_MO_ALLOCATION_INSTR AS AI 
      ON AI.ALLOCATION_INSTR_ID = AD.ALLOCATION_INSTR_ID
      AND AI.ALLOCATION_INSTR_VERSION = AD.ALLOCATION_INSTR_VERSION
  JOIN EQ_MO_ALLOCATION_INSTR_LINKAGE AS AL
      ON AI.ALLOCATION_INSTR_OID = AL.ALLOCATION_INSTR_OID 
  JOIN EQ_MO_BLOCK AS B
      ON B.BLOCK_ID = AL.LINK_PARENT_ID
      AND B.BLOCK_VERSION = AL.LINK_PARENT_VERSION
  LEFT OUTER JOIN EQ_MO_BLOCK_CHARGE AS BC 
      ON BC.BLOCK_OID = B.BLOCK_OID
WHERE AD.LAST_UPDATE_TIME BETWEEN '2013-01-17 00:00:00' AND '2013-01-18 00:00:00' 
AND AC.CHARGE_NAME = 'Commission' 
AND BC.CHARGE_NAME = 'COMMISSION'
AND AD.ALLOCATION_INSTR_VERSION = (SELECT MAX(AD1.ALLOCATION_INSTR_VERSION) 
                       FROM EQ_MO_ALLOCATION_DETAIL AD1
                       WHERE AD1.ALLOCATION_INSTR_VERSION = AD.ALLOCATION_INSTR_VERSION)
AND B.BLOCK_TIME = (SELECT MAX(b1.BLOCK_TIME)
                    FROM EQ_MO_BLOCK b1
                    WHERE b1.BLOCK_ID = B.BLOCK_ID
                   AND b1.BLOCK_VERSION = B.BLOCK_VERSION)
AND AI.VENDOR_PRODUCT = 'OA'
GROUP BY AD.ALLOCATION_INSTR_ID
ORDER BY 1,2

課金額の合計を収集して割り当てコミッションの合計を計算し、それを親 ID「割り当て ID」と対比して表示しようとしています。

ただし、私のグループはばらばらなものです:

グループ化された子コミッションを別のテーブルにある親に結合しますが、次の方法で 2 つに結合しています。

LEFT OUTER JOIN EQ_MO_ALLOCATION_DETAIL_CHARGE AS AC 
  ON AC.ALLOCATION_DETAIL_OID = AD.ALLOCATION_DETAIL_OID

テーブル AD には、最初の選択で確認できる親 ID が含まれています。

ただし、次のエラーが表示されます。

ERROR:  Attribute AD.ALLOCATION_INSTR_VERSION must be GROUPed or used in an aggregate function
4

1 に答える 1

0

その場合GROUP BY AD.ALLOCATION_INSTR_ID、句の一部ではない Select ステートメント内の他のすべての列は、次のGroup byような集計関数の一部である必要があります。Max(AD.ALLOCATION_INSTR_VERSION)

を使用する唯一の理由Group byが を取得することであるSUM(AC.CHARGE_AMOUNT)場合は、サブクエリ内でこれを行うことを考えてから、それをメインの Select ステートメントに結合できます。

編集 :-

次のようなものは、望ましい結果をもたらす可能性があります (テストされていません)。

SELECT
   AD.ALLOCATION_INSTR_ID AS "Allocation Id"
  ,AD.ALLOCATION_INSTR_VERSION AS "Allocation Version"
  ,J.Commission AS "Allocation Commission"
  ,AD.ALLOCATION_ID AS "Sub Allocation Id"
  ,AD.ALLOCATION_VERSION AS "Sub Allocation Version"
  ,AC.CHARGE_AMOUNT AS "Allocation Commission"
  ,B.BLOCK_ID AS "Block Id"
  ,B.BLOCK_VERSION AS "Block Version"
  ,B.BLOCK_SOURCE_SYSTEM AS "Block Source System"
  ,BC.CHARGE_AMOUNT AS "Block Commission"
FROM  EQ_MO_ALLOCATION_DETAIL AS AD
LEFT OUTER JOIN EQ_MO_ALLOCATION_DETAIL_CHARGE AS AC
    ON AC.ALLOCATION_DETAIL_OID = AD.ALLOCATION_DETAIL_OID
JOIN EQ_MO_ALLOCATION_INSTR AS AI
    ON AI.ALLOCATION_INSTR_ID = AD.ALLOCATION_INSTR_ID
    AND AI.ALLOCATION_INSTR_VERSION = AD.ALLOCATION_INSTR_VERSION
JOIN EQ_MO_ALLOCATION_INSTR_LINKAGE AS AL
    ON AI.ALLOCATION_INSTR_OID = AL.ALLOCATION_INSTR_OID
JOIN EQ_MO_BLOCK AS B
    ON B.BLOCK_ID = AL.LINK_PARENT_ID
    AND B.BLOCK_VERSION = AL.LINK_PARENT_VERSION
LEFT OUTER JOIN EQ_MO_BLOCK_CHARGE AS BC
    ON BC.BLOCK_OID = B.BLOCK_OID
RIGHT JOIN (SELECT
            AD.ALLOCATION_INSTR_ID AS "AllocId"
            ,SUM(AC.CHARGE_AMOUNT) AS "Commission"
        FROM  EQ_MO_ALLOCATION_DETAIL AS AD
        LEFT OUTER JOIN EQ_MO_ALLOCATION_DETAIL_CHARGE AS AC
            ON AC.ALLOCATION_DETAIL_OID = AD.ALLOCATION_DETAIL_OID
        JOIN EQ_MO_ALLOCATION_INSTR AS AI
            ON AI.ALLOCATION_INSTR_ID = AD.ALLOCATION_INSTR_ID
            AND AI.ALLOCATION_INSTR_VERSION = AD.ALLOCATION_INSTR_VERSION
        JOIN EQ_MO_ALLOCATION_INSTR_LINKAGE AS AL
            ON AI.ALLOCATION_INSTR_OID = AL.ALLOCATION_INSTR_OID
        JOIN EQ_MO_BLOCK AS B
            ON B.BLOCK_ID = AL.LINK_PARENT_ID
            AND B.BLOCK_VERSION = AL.LINK_PARENT_VERSION
        LEFT OUTER JOIN EQ_MO_BLOCK_CHARGE AS BC
            ON BC.BLOCK_OID = B.BLOCK_OID
        WHERE AD.LAST_UPDATE_TIME BETWEEN '2013-01-17 00:00:00' AND '2013-01-18 00:00:00'
        AND AC.CHARGE_NAME = 'Commission'
        AND BC.CHARGE_NAME = 'COMMISSION'
        AND AD.ALLOCATION_INSTR_VERSION = (
            SELECT MAX(AD1.ALLOCATION_INSTR_VERSION)
            FROM EQ_MO_ALLOCATION_DETAIL AD1
            WHERE AD1.ALLOCATION_INSTR_VERSION = AD.ALLOCATION_INSTR_VERSION)
        AND B.BLOCK_TIME = (
            SELECT MAX(b1.BLOCK_TIME)
            FROM EQ_MO_BLOCK b1
            WHERE b1.BLOCK_ID = B.BLOCK_ID
            AND b1.BLOCK_VERSION = B.BLOCK_VERSION)
        AND AI.VENDOR_PRODUCT = 'OA'
        GROUP BY AD.ALLOCATION_INSTR_ID) AS J
ON J.AllocId = AD.ALLOCATION_INSTR_ID
ORDER BY 1,2
于 2013-01-24T11:18:32.890 に答える