DB2 SQL -在子查询中获取特定的row_number值

dzhpxtsq  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(213)

我正在创建一个DB2 SQL查询,该查询通过子查询从另一个表中获取SUM(CHARGE_AMOUNT)。
现在,我需要分解第1、第2和第3个CHARGE_AMOUNT字段,以便查看:明细行标识,额外费用合计,额外费用1,额外费用2,额外费用3
我无法使其工作,似乎是因为TLORDER.DETAIL_LINE_ID不在我的子子查询的范围内。
SQL error I get
下面的SQL ...请建议是否有更好的方法来执行此查询。

  1. SELECT "TLORDER"."DETAIL_LINE_ID",
  2. "TLORDER"."BILL_TO_NAME",
  3. "TLORDER"."TOTAL_CHARGES",
  4. -- THIS WORKS: Get the sum of the 3 extra charges from table: ACHARGE_TLORDER
  5. (SELECT SUM(CHARGE_AMOUNT)
  6. FROM TMWIN.ACHARGE_TLORDER
  7. WHERE ACODE_ID NOT LIKE 'FSC%' AND DETAIL_LINE_ID = TLORDER.DETAIL_LINE_ID) "TOTAL XTRA CHARGES",
  8. -- NOT WORKING: Get the most recent extra charge
  9. (SELECT CHARGE_AMOUNT "XTRA CHARGE 1" FROM
  10. (
  11. SELECT CHARGE_AMOUNT, ROW_NUMBER() OVER (PARTITION BY DETAIL_LINE_ID ORDER BY ACT_ID DESC) AS rn
  12. FROM TMWIN.ACHARGE_TLORDER WHERE ACODE_ID <> '' AND ACODE_ID NOT LIKE 'FSC%'
  13. AND DETAIL_LINE_ID = TLORDER.DETAIL_LINE_ID
  14. )
  15. WHERE rn = 1),
  16. -- NOT WORKING: Get the 2nd most recent extra charge
  17. (SELECT CHARGE_AMOUNT "XTRA CHARGE 2" FROM
  18. (
  19. SELECT CHARGE_AMOUNT, ROW_NUMBER() OVER (PARTITION BY DETAIL_LINE_ID ORDER BY ACT_ID DESC) AS rn
  20. FROM TMWIN.ACHARGE_TLORDER WHERE ACODE_ID <> '' AND ACODE_ID NOT LIKE 'FSC%'
  21. AND DETAIL_LINE_ID = TLORDER.DETAIL_LINE_ID
  22. )
  23. WHERE rn = 2),
  24. -- NOT WORKING: Get the 3rd most recent extra charge
  25. (SELECT CHARGE_AMOUNT "XTRA CHARGE 3" FROM
  26. (
  27. SELECT CHARGE_AMOUNT, ROW_NUMBER() OVER (PARTITION BY DETAIL_LINE_ID ORDER BY ACT_ID DESC) AS rn
  28. FROM TMWIN.ACHARGE_TLORDER WHERE ACODE_ID <> '' AND ACODE_ID NOT LIKE 'FSC%'
  29. AND DETAIL_LINE_ID = TLORDER.DETAIL_LINE_ID
  30. )
  31. WHERE rn = 3)
  32. FROM "TMWIN"."TLORDER" "TLORDER"
  33. WHERE "TLORDER"."BILL_TO_CODE"!=''
  34. AND ("TLORDER"."PICK_UP_BY_END">='9-12-2021')

下面是一个简化的数据示例:Sample Data Image

bqucvtff

bqucvtff1#

我不知道如何连接订单表和行表--但假设有一种方法可以执行此查询,如下所示:

  1. WITH LINE_WITH_ROW AS (
  2. SELECT
  3. ORDER_ID,
  4. CHARGE_AMOUNT,
  5. ROW_NUMBER() OVER (PARTITION BY DETAIL_LINE_ID ORDER BY ACT_ID DESC) AS rn
  6. FROM TMWIN.ACHARGE_TLORDER
  7. WHERE ACODE_ID <> '' AND ACODE_ID NOT LIKE 'FSC%'
  8. )
  9. SELECT
  10. TLORDER.ORDER_ID,
  11. --TLORDER.DETAIL_LINE_ID, -- can't work not in the table.
  12. TLORDER.BILL_TO_NAME,
  13. TLORDER.TOTAL_CHARGES,
  14. R1.CHARGE_AMOUNT as CHARGE1,
  15. R2.CHARGE_AMOUNT as CHARGE2,
  16. R3.CHARGE_AMOUNT as CHARGE3
  17. FROM TMWIN.TLORDER TLORDER
  18. LEFT JOIN LINE_WITH_ROW AS R1 ON TLORDER.ORDER_ID = R1.ORDER_ID AND RN =1
  19. LEFT JOIN LINE_WITH_ROW AS R2 ON TLORDER.ORDER_ID = R2.ORDER_ID AND RN =2
  20. LEFT JOIN LINE_WITH_ROW AS R3 ON TLORDER.ORDER_ID = R3.ORDER_ID AND RN =3
  21. WHERE TLORDER.BILL_TO_CODE!='' AND (TLORDER.PICK_UP_BY_END>='9-12-2021')
展开查看全部

相关问题