sql—使用子查询对列的值求和

x3naxklr  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(432)

在oracle数据库中,我将数据除以“中心、组、时间戳、年、季度”。然而,我只存在于中心组的测量值,这意味着中心的总值没有被注册,我必须计算它们。

我的想法是使用如下子查询:

  1. WITH table1 as (SELECT
  2. DMDO_ESTRUTURA_ORGANIZA_ET_V.CENTRAL_ABR AS NOME,
  3. CASE
  4. WHEN DMDO_ESTRUTURA_ORGANIZA_ET_V.CENTRAL_ABR <> 'NA'
  5. THEN substr(DMDO_ESTRUTURA_ORGANIZA_ET_V.CENTRAL_ABR,-2)
  6. ELSE 'NA'
  7. END AS CENTRAL,
  8. CASE
  9. WHEN DMDO_ESTRUTURA_ORGANIZA_ET_V.GRUPO_ABR <> 'NA'
  10. THEN 'G' || substr(DMDO_ESTRUTURA_ORGANIZA_ET_V.GRUPO_ABR,-1,1)
  11. ELSE 'NA'
  12. END AS GRUPO,
  13. TRUNC(FOMNMN001."IMN_ANO_MES" , 'MM') AS TIMESTAMP,
  14. EXTRACT(year from FOMNMN001."IMN_ANO_MES") AS YEAR,
  15. CASE
  16. WHEN EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '1' OR EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '2' OR EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '3'
  17. THEN '1'
  18. WHEN EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '4' OR EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '5' OR EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '6'
  19. THEN '2'
  20. WHEN EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '7' OR EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '8' OR EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '9'
  21. THEN '3'
  22. WHEN EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '10' OR EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '11' OR EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '12'
  23. THEN '4'
  24. END AS QUARTER,
  25. SUM( FOMNMN001."IMN_TOTAL_OC") AS IMN_TOTAL_OC ,
  26. SUM( FOMNMN001."IMN_TOTAL_OCNP") AS IMN_TOTAL_OCNP ,
  27. SUM( FOMNMN001."IMN_T1I") AS IMN_T1I,
  28. SUM( FOMNMN001."IMN_T17_MTBF") AS IMN_T17_MTBF,
  29. SUM( FOMNMN001."IMN_T21_MTTF") AS IMN_T21_MTTF,
  30. SUM( FOMNMN001."IMN_OP_PER_HORAS") AS IMN_OP_PER_HORAS,
  31. SUM( FOMNMN001."IMN_IND_MAN_HORAS") AS IMN_IND_MAN_HORAS,
  32. SUM( FOMNMN001."IMN_IND_NP_MAN_HORAS") AS IMN_IND_NP_MAN_HORAS
  33. FROM
  34. FOMNMN001 INNER JOIN DMDO_ESTRUTURA_ORGANIZA_ET_V
  35. ON DMDO_ESTRUTURA_ORGANIZA_ET_V.HIERARQUIA=FOMNMN001.HIERARQUIA
  36. AND DMDO_ESTRUTURA_ORGANIZA_ET_V.DIRECCAO IN ('2000PT')
  37. AND DMDO_ESTRUTURA_ORGANIZA_ET_V.CENTRAL_ABR <> 'NA'
  38. INNER JOIN DMDO_TEMPO
  39. ON DMDO_TEMPO.DATA=FOMNMN001.DATA
  40. AND DMDO_TEMPO.DATA >= '20190101'
  41. AND MOD(TO_NUMBER (EXTRACT(month from FOMNMN001."IMN_ANO_MES")) , 3) = 0
  42. GROUP BY DMDO_ESTRUTURA_ORGANIZA_ET_V.CENTRAL_ABR,
  43. CASE
  44. WHEN DMDO_ESTRUTURA_ORGANIZA_ET_V.CENTRAL_ABR <> 'NA'
  45. THEN substr(DMDO_ESTRUTURA_ORGANIZA_ET_V.CENTRAL_ABR,-2)
  46. ELSE 'NA'
  47. END,
  48. CASE
  49. WHEN DMDO_ESTRUTURA_ORGANIZA_ET_V.GRUPO_ABR <> 'NA'
  50. THEN 'G' || substr(DMDO_ESTRUTURA_ORGANIZA_ET_V.GRUPO_ABR,-1,1)
  51. ELSE 'NA'
  52. END,
  53. TRUNC(FOMNMN001."IMN_ANO_MES" , 'MM'),
  54. EXTRACT(year from FOMNMN001."IMN_ANO_MES"),
  55. CASE
  56. WHEN EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '1' OR EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '2' OR EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '3'
  57. THEN '1'
  58. WHEN EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '4' OR EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '5' OR EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '6'
  59. THEN '2'
  60. WHEN EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '7' OR EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '8' OR EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '9'
  61. THEN '3'
  62. WHEN EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '10' OR EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '11' OR EXTRACT(month from FOMNMN001."IMN_ANO_MES") = '12'
  63. THEN '4'
  64. END
  65. ORDER BY 4, 2, 3
  66. )
  67. Select NOME , CENTRAL , GRUPO , TIMESTAMP , YEAR , QUARTER ,
  68. CASE
  69. WHEN CENTRAL <> 'NA' AND GRUPO <> 'NA'
  70. THEN IMN_TOTAL_OC
  71. WHEN CENTRAL <> 'NA' AND GRUPO = 'NA'
  72. THEN (SELECT SUM (IMN_TOTAL_OC) from table1 group by NOME , CENTRAL ,
  73. TIMESTAMP , YEAR , QUARTER)
  74. END AS IMN_OC
  75. from table1

预期输出(以红色显示值):

有人知道怎么做吗?

hfsqlsce

hfsqlsce1#

您可以使用group by rollup()计算小计和总计-请参阅文档和示例。假设我们有以下情况(原来是表名或视图名):

  1. select
  2. nome, central, grupo, trunc( tstamp )
  3. , yr, quarter, totaloc, totalocnp
  4. from original ;
  5. NOME CENTRAL GRUPO TRUNC(TSTAMP) YR QUARTER TOTALOC TOTALOCNP
  6. _______ __________ ________ ________________ _______ __________ __________ ____________
  7. PTLR LR G1 15-JUL-20 2019 1 3 1
  8. PTLR LR G2 15-JUL-20 2019 1 1
  9. PTLR LR NA 15-JUL-20 2019 1
  10. PTLJ RJ G1 15-JUL-20 2019 1 2 1
  11. PTLJ RJ G2 15-JUL-20 2019 1 1
  12. PTLJ RJ G3 15-JUL-20 2019 1 4 3
  13. PTLJ RJ NA 15-JUL-20 2019 1
  14. PTLN SN G1 15-JUL-20 2019 1 5 5
  15. PTLN SN G2 15-JUL-20 2019 1 4 3
  16. PTLN SN G3 15-JUL-20 2019 1 2 1
  17. PTLN SN G4 15-JUL-20 2019 1 3 3
  18. PTLN SN NA 15-JUL-20 2019 1
  19. PTLR LR G1 13-SEP-20 2019 2 3 3
  20. PTLR LR G2 13-SEP-20 2019 2 1 1
  21. PTLR LR NA 13-SEP-20 2019 2
  22. PTLJ RJ G1 13-SEP-20 2019 2 1 0
  23. PTLJ RJ G2 13-SEP-20 2019 2 0 0
  24. PTLJ RJ G3 13-SEP-20 2019 2 4 3

按汇总分组查询

  1. select
  2. nome, central, yr, quarter
  3. , sum( totaloc ) totaloc
  4. , sum( totalocnp ) totalocnp
  5. from original
  6. group by rollup( ( nome, central ), yr, quarter )
  7. order by 1, 2, 3, 4
  8. ;
  9. -- result
  10. NOME CENTRAL YR QUARTER TOTALOC TOTALOCNP
  11. _______ __________ _______ __________ __________ ____________
  12. PTLJ RJ 2019 1 7 4
  13. PTLJ RJ 2019 2 5 3
  14. PTLJ RJ 2019 12 7
  15. PTLJ RJ 12 7
  16. PTLN SN 2019 1 14 12
  17. PTLN SN 2019 14 12
  18. PTLN SN 14 12
  19. PTLR LR 2019 1 4 1
  20. PTLR LR 2019 2 4 4
  21. PTLR LR 2019 8 5
  22. PTLR LR 8 5
  23. 34 24

在这儿摆弄。
另一件小事:当看到你的第二个屏幕截图时,我们看到你正在使用case。。。提取。。。寻找“季度数字”。这太复杂了。只需使用to_char(the date,'q')。

  1. -- eg
  2. select to_char( systimestamp, 'Q' ) from dual ;
  3. TO_CHAR(SYSTIMESTAMP,'Q')
  4. ____________________________
  5. 3
  6. -- with your "original" table:
  7. select to_char( trunc( tstamp ), 'Q' ) from original ;

另请参见:格式化模型文档。

展开查看全部

相关问题