在Oracle SQL中透视列和应用格式掩码的不同方法

y3bcpkx1  于 2023-10-16  发布在  Oracle
关注(0)|答案(2)|浏览(128)

我使用SQL Developer和BIRT Viewer,在应用格式掩码'999G999G999G999G999G999G990'时出现此错误:

  1. ORA-01722: μη αποδεκτός αριθμός
  2. 01722. 00000 - "invalid number"
  3. *Cause: The specified number was invalid.
  4. *Action: Specify a valid number.

查询:

  1. select
  2. *
  3. from
  4. ( select pc.description production_category,
  5. decode(pph.allocation,1,'GR-70B',2,'BG',3,'GR-70A',4,'GR-70Δ',6,'UK',8,'USA-KY',9,'USA-OR') alloc,
  6. to_number(to_char(sum(ppd.pcs),'999G999G999G999G999G999G990')) pcs
  7. from prd_production_hd pph,
  8. prd_production_details ppd,
  9. prod_categories pc
  10. where pph.id = ppd.production_id
  11. and ppd.prd_category_id in (14,15,16,17,18,20,21,51,52,56)
  12. and ppd.pcs is not null
  13. and ppd.prd_category_id = pc.id
  14. and pph.prod_date = :P_DATE
  15. group by pc.description,pph.allocation
  16. )
  17. pivot (
  18. sum(pcs)
  19. for alloc in ('GR-70B' GR_70Β, 'BG' BG, 'GR-70A' GR_70Α, 'GR-70Δ' GR_70Δ,'UK' UK,'USA-KY' USA_KY,'USA-OR' USA_OR)
  20. )`

是否有其他方法来应用格式掩码?

gk7wooem

gk7wooem1#

您似乎想要聚合并格式化数字:

  1. SELECT production_category,
  2. TO_CHAR(GR_70Β,'999G999G999G999G999G999G990') AS GR_70B,
  3. TO_CHAR(BG, '999G999G999G999G999G999G990') AS BG,
  4. TO_CHAR(GR_70Α,'999G999G999G999G999G999G990') AS GR_70Α,
  5. TO_CHAR(GR_70Δ,'999G999G999G999G999G999G990') AS GR_70Δ,
  6. TO_CHAR(UK, '999G999G999G999G999G999G990') AS UK,
  7. TO_CHAR(USA_KY,'999G999G999G999G999G999G990') AS USA_KY,
  8. TO_CHAR(USA_OR,'999G999G999G999G999G999G990') AS USA_OR
  9. FROM (
  10. SELECT pc.description AS production_category,
  11. pph.allocation,
  12. ppd.pcs
  13. FROM prd_production_hd pph
  14. INNER JOIN prd_production_details ppd
  15. ON pph.id = ppd.production_id
  16. INNER JOIN prod_categories pc
  17. ON ppd.prd_category_id = pc.id
  18. WHERE ppd.prd_category_id in (14,15,16,17,18,20,21,51,52,56)
  19. AND ppd.pcs is not null
  20. AND pph.prod_date = :P_DATE
  21. )
  22. PIVOT (
  23. SUM(pcs)
  24. FOR allocation in (
  25. 1 AS GR_70Β,
  26. 2 AS BG,
  27. 3 AS GR_70Α,
  28. 4 AS GR_70Δ,
  29. 6 AS UK,
  30. 8 AS USA_KY,
  31. 9 AS USA_OR
  32. )
  33. );
  • 注意:在PIVOT之前不需要DECODEallocation s;你可以在PIVOT中实现。你也不需要聚合两次;在PIVOT中重复一次。*
展开查看全部
qybjjes1

qybjjes12#

在我看来,这是错误的:

  1. to_number(to_char(sum(ppd.pcs),'999G999G999G999G999G999G990'))

由内而外:

  • sum(ppd.pcs)导致number数据类型值
  • 您将to_char应用于该数值并提供格式模型(这是可以的)
  • 但是,然后你应用to_number到它-为什么?你就是从那里开始的!

因此:

  • 删除to_number(to_char(并保留sum(ppd.pcs)
  • 结果是number,或者
  • 删除to_number(
  • 结果是一个 string
展开查看全部

相关问题