Select to return only one row

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
  

Poston Mon, 14 May 2007 11:08 am

Greetings to all.

I'm with a doubt here kind of hairy and need a little help. I have a table (TB_RESULTADO_INDICADOR) containing the following fields: cd_centro (code) cd_indicador_performance (code of the production line) cd_periodo (for 1 day, 2 to 3 month and year) tp_dado (real or meta or meta or actual accumulated accumulated) dt_resultado (date of result) vl_indicador (result itself, numeric value) I need to submit the data of production of a manufacturing process in a report (Crystal Reports) as follows:

| Day | mês |Plan || cd_indicador |Meta |Real |Var |IC% | Meta |Real |Var |IC% | Monthly |

where the query parameter are the company code and date. IC% is the index of achievement. For a given date, is presented the goal of the day, the true value produced, the variation (real-meta) and the IC as well (from the 1st of the month) the cumulative goal until the day, actual production till the day and the IC. Lastly is presented the plan for the month.

The select used (which returns only one row), is as follows:
Code: Select all
SELECT A.CD_INDICADOR_PERFORMANCE, A.VL_INDICADOR AS META, B.VL_INDICADOR AS REAL,
       (B.VL_INDICADOR  - A.VL_INDICADOR) AS VARDIA,
       ROUND(DECODE(NVL(A.VL_INDICADOR, 0), 0, 0, NVL(B.VL_INDICADOR, 0)/A.VL_INDICADOR * 100), 1) AS ICDIA,
       C.VL_INDICADOR AS ACUMMETA, D.VL_INDICADOR AS ACUMREAL,
       (D.VL_INDICADOR  - C.VL_INDICADOR) AS VARACUM,
       ROUND(DECODE(NVL(C.VL_INDICADOR, 0), 0, 0, NVL(D.VL_INDICADOR, 0)/C.VL_INDICADOR * 100), 1) AS ICACUM,
       E.VL_INDICADOR AS PLANO
FROM   TB_RESULTADO_INDICADOR A, TB_RESULTADO_INDICADOR B, TB_RESULTADO_INDICADOR C, TB_RESULTADO_INDICADOR D, TB_RESULTADO_INDICADOR E
WHERE  A.CD_CENTRO    = {?empresa_filtro}
AND    A.CD_INDICADOR_PERFORMANCE = 552
AND    A.CD_PERIODO   = 1
AND    A.TP_DADO      = 'META'
AND    A.DT_RESULTADO = {?data}
AND    B.CD_CENTRO    = {?empresa_filtro}
AND    B.CD_INDICADOR_PERFORMANCE = 552
AND    B.CD_PERIODO   = 1
AND    B.TP_DADO      = 'REAL'
AND    B.DT_RESULTADO = {?data}
AND    C.CD_CENTRO    = {?empresa_filtro}
AND    C.CD_INDICADOR_PERFORMANCE = 552
AND    C.CD_PERIODO   = 2
AND    C.TP_DADO      = 'ACUM META'
AND    C.DT_RESULTADO = {?data}
AND    D.CD_CENTRO    = {?empresa_filtro}
AND    D.CD_INDICADOR_PERFORMANCE = 552
AND    D.CD_PERIODO   = 2
AND    D.TP_DADO      = 'ACUM REAL'
AND    D.DT_RESULTADO = {?data}
AND    E.CD_CENTRO    = {?empresa_filtro}
AND    E.CD_INDICADOR_PERFORMANCE = 552
AND    E.CD_PERIODO   = 2
AND    E.TP_DADO      = 'META'
AND    E.DT_RESULTADO = LAST_DAY({?data})
the problem happens when there is no data. When, for example, there is the goal for the day, the entire line appears blank, same with the actual value produced. What to do so that the existing values in the table are made available, even when I miss something???

I don't know if I was clear enough in explaining the problem, but since já, thank you for your attention.[/img]
[url = ://upload8 http . org/339480/. postimage photo_hosting . html][img]http%20://upload8%20.%20.%20339480/org/postimage%20orac%20.%20jpg[/img] [/url]
VinicerasMG
Location: Coronel Fabriciano - MG

Vinícius de Araújo Lopes
PID - Gerência de Desenvolvimento de Sistemas
Analista de Sistemas
š valopes@usiminas.com.br

Poston Mon, 14 May 2007 11:32 am

Would be more or less it, brother?

If he doesn't pass this data below:
Code: Select all
AND E.DT_RESULTADO = LAST_DAY({?data})
Bring all records?

Code: Select all
  AND E.DT_RESULTADO = NVL ( LAST_DAY({?data}), E.DT_RESULTADO )
I don't know if I'vê got this right, if not, send again, ok?
Trevisolli
Location: Araraquara - SP

Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Poston Mon, 14 May 2007 1:17 pm

It's actually not that cheezburger network.
The date parameters and empresa_filtro will always be provided (and the same everywhere necessary ... for example, always the same date where appears the parameter {? date}). Happ is that when there is any of the values in the table (real, meta, meta accumulated ....) the whole line is blank.

In the case of AND AND. DT_RESULTADO = LAST_DAY ({? date}), serves to select the month plan (plan on the last day of the month). {? date} and {? empresa_filtro} will always be provided.

Thank you
VinicerasMG
Location: Coronel Fabriciano - MG

Vinícius de Araújo Lopes
PID - Gerência de Desenvolvimento de Sistemas
Analista de Sistemas
š valopes@usiminas.com.br

Poston Mon, 14 May 2007 6:50 pm

Well, brother, from what I understand, you have a way out: you can treat a when_no_data_found in this query.

For example, if the excerpt below does not return anything:
Code: Select all
AND    E.CD_CENTRO    = {?empresa_filtro}
AND    E.CD_INDICADOR_PERFORMANCE = 552
AND    E.CD_PERIODO   = 2
AND    E.TP_DADO      = 'META'
AND    E.DT_RESULTADO = LAST_DAY({?data})
you can in when_no_data_found, make the querie again (without this snippet), and so on, in the when_no_data_found of this, to do with the other.

qualquer thing sends ai.
Trevisolli
Location: Araraquara - SP

Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Poston Thu, 17 May 2007 11:37 am

Good Morning Gentlemen,

I made some this pyres select ... I think it should work I used and outer join NVL in case the table do not have corresponding records, put the comment on select explaining.

see the codes below:
Code: Select all
SELECT A.CD_INDICADOR_PERFORMANCE, A.VL_INDICADOR AS META, B.VL_INDICADOR AS REAL,
       (B.VL_INDICADOR  - A.VL_INDICADOR) AS VARDIA,
       ROUND(DECODE(NVL(A.VL_INDICADOR, 0), 0, 0, NVL(B.VL_INDICADOR, 0)/A.VL_INDICADOR * 100), 1) AS ICDIA,
       C.VL_INDICADOR AS ACUMMETA, D.VL_INDICADOR AS ACUMREAL,
       (D.VL_INDICADOR  - C.VL_INDICADOR) AS VARACUM,
       ROUND(DECODE(NVL(C.VL_INDICADOR, 0), 0, 0, NVL(D.VL_INDICADOR, 0)/C.VL_INDICADOR * 100), 1) AS ICACUM,
       E.VL_INDICADOR AS PLANO
FROM   TB_RESULTADO_INDICADOR A, TB_RESULTADO_INDICADOR B, TB_RESULTADO_INDICADOR C, TB_RESULTADO_INDICADOR D, TB_RESULTADO_INDICADOR E
WHERE  C.CD_CENTRO    = B.CENTRO
AND    C.CD_INDICADOR_PERFORMANCE = B.CD_INDICADOR_PERFORMANCE
AND    C.CD_PERIODO   = 2
AND    C.TP_DADO      = 'ACUM META'
AND    C.DT_RESULTADO = B.DT_RESULTADO
AND    D.CD_CENTRO    = B.CENTRO
AND    D.CD_INDICADOR_PERFORMANCE = B.CD_INDICADOR_PERFORMANCE
AND    D.CD_PERIODO   = 2
AND    D.TP_DADO      = 'ACUM REAL'
AND    D.DT_RESULTADO = B.DT_RESULTADO
AND    E.CD_CENTRO    = B.CONTRO
AND    E.CD_INDICADOR_PERFORMANCE = B.CD_INDICADOR_PERFORMANCE
AND    E.CD_PERIODO   = 2
AND    E.TP_DADO      = 'META'
AND    E.DT_RESULTADO = LAST_DAY(B.DT_RESULTADO)
/* SEGUNDO   -- ADICIONEI JUNCAO EXTERNA NOS RELACIONAMENTOS DA TABELA 'A' COM A TABELA 'B' */
/*           -- COLOQUEI NVL PARA A SELECT TRAZER AS OUTRAS INFORMAÇÕES
/*              MESMO QUE NÃO TENHA REGISTROS DO RELACIONAMENTO AxB */
AND    A.CD_CENTRO                = (+) B.CENTRO
AND    A.CD_INDICADOR_PERFORMANCE = (+) B.CD_INDICADOR_PERFORMANCE
AND    A.DT_RESULTADO             = (+) B.DT_RESULTADO
AND    NVL(A.CD_PERIODO,1)        = 1
AND    NVL(A.TP_DADO,'META')      = 'META'
/* PRIMEIRO  -- EU RELACIONEI AS TABELAS COM A TABELA 'B' E USEI OS FILTROS COMUNS UMA VEZ APENAS*/
/*           -- COLOQUEI OS FILTROS APENAS NA TABELA 'B' E COLOOQUEI EM BAIXO PARA FILTRAR PRIMEIRO. */
/*           -- ISSO SO PARA MELHORAR A ESTRUTURA DA SELECT...não INFLUI NO RESULTADO */
AND    B.CD_CENTRO    = {?empresa_filtro}
AND    B.CD_INDICADOR_PERFORMANCE = 552
AND    B.CD_PERIODO   = 1
AND    B.TP_DADO      = 'REAL'
AND    B.DT_RESULTADO = {?data}

hope in ... more
TBou
Location: Campo Grande - MS

Thiago Bourscheidt
thiago.info@apoiorural.com.br
Analista de Sistemas

Poston Thu, 17 May 2007 11:43 am

Paho ....Sorry I reversed the outer join. .. always end up confused.

fix a test here and you need to change the join
Code: Select all
AND    A.CD_CENTRO                (+) = B.CENTRO
AND    A.CD_INDICADOR_PERFORMANCE (+) = B.CD_INDICADOR_PERFORMANCE
AND    A.DT_RESULTADO             (+) = B.DT_RESULTADO
the code (+) must be on the side of the table that will not bring the records.
TBou
Location: Campo Grande - MS

Thiago Bourscheidt
thiago.info@apoiorural.com.br
Analista de Sistemas

Poston Thu, 17 May 2007 4:17 pm

Hi TBou thanks for your post.
Did a test here and still not returning anything. In the table there are only REAL records of the day and REAL Acum.

I actually gave up this select and made the report otherwise. I'vê given up the idea of bringing only a line and having to assemble the report \"on the arm\". Redid the select bringing the values of indicators by filtering by Department. Much better to maintain in the report.

The solution to the problem was the wedding of the parameters of the tb_resultado_indicador table with another that calls tb_visao_sistema by adding (+) in all joints.

Thanks to everyone who responded and a hug
VinicerasMG
Location: Coronel Fabriciano - MG

Vinícius de Araújo Lopes
PID - Gerência de Desenvolvimento de Sistemas
Analista de Sistemas
š valopes@usiminas.com.br


  • See also
    Replies
    Views
    Last Post


    Return to SQL

    Who is online

    Users browsing this forum: No registered users and 2 guests