C?LCULO SQL

LUIS.HERRERA 16/12/2014 15:26:40
#443244
Amigos encerrei o outro tópico e abri esse para facilitar o entendimento, pois analisando tive de alterar toda a estrutura das tabelas. Ficou mais flexível, porém me [Ô]enrolei[Ô] mais ainda no SQL agora.

Tabelas (explicando)
Config - tem o campo LAIAPONTOSCORTESIG que é o valor de compara para definir se o campo que irei precisar no SELECT (SIG) será false ou true
LAIA_ITENSGRUPO - tem a relação de itens usados no cálculo e seus respectivos PONTOS para soma e comparação posterior
LAIA - tabela principal com os registros (ex como vendas)
LAIA_CALCULOSIG - tabela auxiliar com itens dos grupos associados ao registro do LAIA (tabela principal)

Exemplo de dados cadastrados
CONFIG.LAIAPONTOSCORTESIG = 50 (PARA EMPRESA ID = 1)

LAIA_ITENSGRUPO
1 - 1 - 1 - ITEM(1) GRUPO(1) - 2
2 - 1 - 1 - ITEM(2) GRUPO(1) - 5
3 - 1 - 1 - ITEM(3) GRUPO(1) - 15
4 - 2 - 1 - ITEM(1) GRUPO(2) - 5
5 - 2 - 1 - ITEM(2) GRUPO(2) - 15
6 - 2 - 1 - ITEM(3) GRUPO(2) - 30
7 - 3 - 1 - ITEM(1) GRUPO(3) - 6
8 - 3 - 1 - ITEM(2) GRUPO(3) - 10
9 - 3 - 1 - ITEM(3) GRUPO(3) - 20

LAIA (ID EMPRESA = 1)
1 - 1 - 5 - 1 - 1
LAIA_CALCULOSIG
1 - 1 - 1 - 2
1 - 1 - 2 - 5
1 - 1 - 3 - 9

Com base nos dados desse registro único (1) tabela LAIA, temos a seguinte situação na tabela LAIA_CALCULOSIG
IDLAIA (coluna 1) = 1
IDEmpresa (Coluna 2) = 1
IDGrupo (coluna 3) = 1,2,3 (sempre conterá todos os grupos cadastrados nota: essa tabela não incluí na estrutura pois não é usada neste SELECT
IDItem (coluna 4) = 2, 5, 9 os respectivos pontos em sua tabela LAIA_ITENSGRUPO SÃO: 5 + 15 + 20 => TOTAL = 40 PONTOS é menor que 50 da tabela CONFIG então o campo SIG no SELECT seria false para esse registro.

Se o próximo registro tiver a soma dos itens igual ou superior a valor de CONFIG então seria true

SELECT +/- ASSIM
SELECT
LAIA.IDLAIA,
LAIA.IDEMPRESA,
LAIA.IDDEPTO,
LAIA.IDATIVIDADE,
SIG = ((SOMA todos os pontos correspondentes dos itens de LAIA_CALCULOSIG em LAIA_ITENSGRUPO ON (LAIA_CALCULOSIG.IDITEM = LAIA_ITENSGRUPO.IDITEM)
WHERE LAIACALCULOSIG.IDLAIA = LAIA.IDLAIA)
se SOMA < CONFIG.LAIAPONTOSCORTESIG = FALSE SENAO TRUE


Será que deu para entender?
FILMAN 16/12/2014 17:54:33
#443249
Resposta escolhida
Tente assim

SELECT
T.IDLAIA,
T.IDEMPRESA,
T.IDDEPTO,
T.IDATIVIDADE,
SUM(T.PONTOS) AS TOTALPONTOS,
C.LAIAPONTOSCORTESIG AS PONTOSCONFIG,
CASE WHEN SUM(T.PONTOS) > C.LAIAPONTOSCORTESIG THEN [ô]FALSE[ô] ELSE [ô]TRUE[ô] END AS SIG
FROM (
SELECT
L.IDLAIA,
L.IDEMPRESA,
L.IDDEPTO,
L.IDATIVIDADE,
LI.PONTOS
FROM LAIA L
INNER JOIN LAIA_CALCULOSIG LC ON (LC.IDLAIA = L.IDLAIA AND LC.IDEMPRESA = L.IDEMPRESA)
INNER JOIN LAIA_ITENSGRUPO LI ON (LI.IDGRUPO = LC.IDGRUPO AND LI.IDITEM = LC.IDITEM)
WHERE L.IDEMPRESA = 1
) T
INNER JOIN CONFIG C ON (C.IDEMPRESA = T.IDEMPRESA)
GROUP BY T.IDLAIA,T.IDEMPRESA,T.IDDEPTO,T.IDATIVIDADE,C.LAIAPONTOSCORTESIG


Resultado:
1 1 5 1 40 50 TRUE
FILMAN 18/12/2014 13:24:54
#443286
e ai amigo deu certo?
LUIS.HERRERA 18/12/2014 14:03:50
#443288
Filman boa tarde. Não dei retorno ainda, porque não consegui terminar a tela de cadastro que é meio complexa. Por isso não tive como fazer testes, já que as tabelas não tem dados ainda e não quero incluir na mão, pois posso cometer erros de consistência com outras tabelas. Assim que terminar o cadastro e inserir os dados farei o teste, pois é parte fundamental dessa tela para carregar os dados. Acho que até amanhã devo terminar.
FILMAN 18/12/2014 14:19:42
#443289
Tranquilo, só perguntei por perguntar mesmo, pois fiquei curioso pra saber!
LUIS.HERRERA 18/12/2014 16:01:34
#443293
Filman estou fazendo a rotina agora, mas ao analisar achei coisas estranhas:

1) No final a terceira linha de baixo para cima ) T não entendi.
é isso mesmo um T depois de FROM sem AS ?

2) Esse T passa a receber os dados do select interno de from? Então o:
L.IDLAIA passa a ser T.IDLAIA
L.IDEMPRESA passa a ser T.IDEMPRESA
é isso mesmo?

FILMAN 18/12/2014 16:06:48
#443295
Sim, esse T representa um ALIAS para nomear a tabela, ou seja o Sub-SELECT que esta no FROM é denominado como T isso você pode mudar o nome se quiser!

LUIS.HERRERA 08/01/2015 10:35:34
#443661
Filman bom dia.

estou respondendo agora após terminar toda a rotina deste módulo. Os testes ficaram perfeitos, tudo funcionou corretamente, só pequenos ajustes (trocar o sinal de > pelo < e incluir outros campos), mas seu código funcionou perfeitamente.

Muito obrigado pela ajuda.

Tópico encerrado , respostas não são mais permitidas