2013-01-24 72 views
0

我有以下查詢:SQL查詢來計算孩子總價值爲父母

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」

但是我GROUP BY是一些什麼脫節:

我參加分組孩子佣金他們的父母,這是位於另一個表,但我連接兩個通過:

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

Downvoted,沒有理由? – Will

+1

從我所看到的,選擇列表中的每個字段,除了SUM(AC.CHARGE_AMOUNT)作爲「分配委員會」,應該在逗號後面的GROUP BY AD.ALLOCATION_INSTR_ID行中出現。如果您只是添加AD.ALLOCATION_INSTR_VERSION,那麼您可能最終會出現另一個字段的相同錯誤。 – Kitet

+1

幫助示例數據和所需輸出會更容易。 – DMK

回答

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

是的,我認爲你已經擊中了頭,我試圖在一個函數內做太多。 – Will

+1

@會。 。 。一個查詢你不想做太多。你只是沒有正確表達查詢。 DMK是正確的。只要在子查詢中進行彙總,就可以解決問題。 –