2013-01-24 74 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是正确的。只要在子查询中进行汇总,就可以解决问题。 –