ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Montando um select firebird 2.5?
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qui Fev 21, 2019 4:28 pm    Assunto: Montando um select firebird 2.5? Responder com Citação

Tenho este select
Código:
SELECT cs.ID_Cliente_Software AS AZCode,
       cs.Codigo_Cliente AS Customer,
       cs.Codigo_Software AS Product,
       cs.Data_Hora AS Subscription,
       coalesce(c.Valor_Contrato_Mensal, 0.0) AS Cost,
  ( SELECT count(*)
   FROM financeiro_contas fc
   WHERE addday(fc.data_vencimento,
                  (SELECT FIRST 1 Dias_Tolerancia
                   FROM Financeiro_Cobranca_Config
                   ORDER BY PK_Financeiro_Cobranca_Config DESC)) <= CURRENT_DATE
     AND fc.data_quitacao IS NULL
     AND fc.cancelado <> 'Sim'
     AND fc.Boleto = 'Sim'
     AND fc.Codigo_Cliente = cs.Codigo_Cliente ) AS QuantidadeParcelas,
       coalesce(c.Data_Limite_Liberacao, cast(addday(CURRENT_DATE, -1) AS date)) AS LiberadoAte,
       coalesce(c.Contrato_Suporte_Liberado, 'Não') AS Liberado
FROM Cliente_Software cs
INNER JOIN Cliente c ON c.Codigo = cs.Codigo_Cliente
WHERE cs.codigo_cliente = 17041


Veio 3 resultados no select
e na coluna product veio os codigos
5
1
93

Tenho uma SP que faz uns calculos e traz o valor de cada produto
Código:
 SELECT produtos.codigo,
        COALESCE(SUM(sp_ret_vl_contratos_cli.valor),0) as valor
            FROM sp_ret_vl_contratos_cli(:Pcodigo_cliente, '')
      INNER JOIN produtos on produtos.codigo = sp_ret_vl_contratos_cli.codigo_software
        GROUP BY produtos.codigo, produtos.nome

Neste resultado veio os produtos
1
93
que tem valor

Tem como associar esta SP ao select acima e mudar esta coluna abaixo
Código:
  coalesce(c.Valor_Contrato_Mensal, 0.0) AS Cost,

pela SP em seus respectivos IDs?
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Fev 21, 2019 5:11 pm    Assunto: Responder com Citação

Boa tarde,

Essa SP retorna mais de um registro por produto? Esse Sum é mesmo necessário?
Se essa SP retorna só um registro por produto, acredito que o Sum não seja necessário e nesse caso me parece que você pode adicionar um Join no primeiro Select com a SP.

Espero que ajude

_________________
Assinatura: https://www.imoveisemexposicao.com.br/imoveis-alugar-guarulhos-residencial-casa
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qui Fev 21, 2019 6:20 pm    Assunto: Responder com Citação

imex escreveu:
Boa tarde,

Essa SP retorna mais de um registro por produto? Esse Sum é mesmo necessário?
Se essa SP retorna só um registro por produto, acredito que o Sum não seja necessário e nesse caso me parece que você pode adicionar um Join no primeiro Select com a SP.

Espero que ajude

_________________
Assinatura: https://www.imoveisemexposicao.com.br/imoveis-alugar-guarulhos-residencial-casa


Então Imex, creio que retorne apenas um registro por produto, seria desta forma então o select?

Código:
SELECT cs.ID_Cliente_Software AS AZCode,
       cs.Codigo_Cliente AS Customer,
       cs.Codigo_Software AS Product,
       cs.Data_Hora AS Subscription,
       --coalesce(c.Valor_Contrato_Mensal, 0.0) AS Cost,
       COALESCE(SUM(sp_ret_vl_contratos_cli.valor),0.0) as Cost,
  ( SELECT count(*)
   FROM financeiro_contas fc
   WHERE addday(fc.data_vencimento,
                  (SELECT FIRST 1 Dias_Tolerancia
                   FROM Financeiro_Cobranca_Config
                   ORDER BY PK_Financeiro_Cobranca_Config DESC)) <= CURRENT_DATE
     AND fc.data_quitacao IS NULL
     AND fc.cancelado <> 'Sim'
     AND fc.Boleto = 'Sim'
     AND fc.Codigo_Cliente = cs.Codigo_Cliente ) AS QuantidadeParcelas,
       coalesce(c.Data_Limite_Liberacao, cast(addday(CURRENT_DATE, -1) AS date)) AS LiberadoAte,
       coalesce(c.Contrato_Suporte_Liberado, 'Não') AS Liberado
FROM Cliente_Software cs
LEFTJOIN sp_ret_vl_contratos_cli(:Pcodigo_cliente, '') ON sp_ret_vl_contratos_cli.codigo_software = cs.codigo_software
INNER JOIN Cliente c ON c.Codigo = cs.Codigo_Cliente
WHERE cs.codigo_cliente = :Pcodigo_cliente
GROUP BY AZCode, Customer, Product, Subscription, QuantidadeParcelas, LiberadoAte, Liberado


Obrigado por ajudar.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Fev 22, 2019 9:55 am    Assunto: Responder com Citação

Verifiquei aqui Imex, e as vezes pode trazer mais de um valor no produto sim.

Ai duplicou o valor
Na sp traz assim
Código:
produto----valor-------data-----quantidade
1-------------46,00----11/12/18----------1
1---------46.000,00---15/02/19----------1000


No select ficou
Código:
1-----------46.046,00
1-----------46.046,00

_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Fev 22, 2019 10:33 am    Assunto: Responder com Citação

Experimente fazer uns testes mais ou menos dessa forma:

Código:
WITH CTE_SP as
(
    SELECT codigo_software, SUM(valor) as valor
    FROM sp_ret_vl_contratos_cli(:Pcodigo_cliente, '')
    GROUP BY codigo_software
)

SELECT cs.ID_Cliente_Software AS AZCode,
       cs.Codigo_Cliente AS Customer,
       cs.Codigo_Software AS Product,
       cs.Data_Hora AS Subscription,
       COALESCE(sp.valor, 0) as valor,
  ( SELECT count(*)
   FROM financeiro_contas fc
   WHERE addday(fc.data_vencimento,
                  (SELECT FIRST 1 Dias_Tolerancia
                   FROM Financeiro_Cobranca_Config
                   ORDER BY PK_Financeiro_Cobranca_Config DESC)) <= CURRENT_DATE
     AND fc.data_quitacao IS NULL
     AND fc.cancelado <> 'Sim'
     AND fc.Boleto = 'Sim'
     AND fc.Codigo_Cliente = cs.Codigo_Cliente ) AS QuantidadeParcelas,
       coalesce(c.Data_Limite_Liberacao, cast(addday(CURRENT_DATE, -1) AS date)) AS LiberadoAte,
       coalesce(c.Contrato_Suporte_Liberado, 'Não') AS Liberado
FROM Cliente_Software cs
INNER JOIN Cliente c ON c.Codigo = cs.Codigo_Cliente
LEFT JOIN CTE_SP sp on sp.codigo_software = cs.Codigo_Software
WHERE cs.codigo_cliente = 17041


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Fev 22, 2019 10:41 am    Assunto: Responder com Citação

imex escreveu:
Experimente fazer uns testes mais ou menos dessa forma:

Código:
WITH CTE_SP as
(
    SELECT codigo_software, SUM(valor) as valor
    FROM sp_ret_vl_contratos_cli(:Pcodigo_cliente, '')
    GROUP BY codigo_software
)

SELECT cs.ID_Cliente_Software AS AZCode,
       cs.Codigo_Cliente AS Customer,
       cs.Codigo_Software AS Product,
       cs.Data_Hora AS Subscription,
       COALESCE(sp.valor, 0) as valor,
  ( SELECT count(*)
   FROM financeiro_contas fc
   WHERE addday(fc.data_vencimento,
                  (SELECT FIRST 1 Dias_Tolerancia
                   FROM Financeiro_Cobranca_Config
                   ORDER BY PK_Financeiro_Cobranca_Config DESC)) <= CURRENT_DATE
     AND fc.data_quitacao IS NULL
     AND fc.cancelado <> 'Sim'
     AND fc.Boleto = 'Sim'
     AND fc.Codigo_Cliente = cs.Codigo_Cliente ) AS QuantidadeParcelas,
       coalesce(c.Data_Limite_Liberacao, cast(addday(CURRENT_DATE, -1) AS date)) AS LiberadoAte,
       coalesce(c.Contrato_Suporte_Liberado, 'Não') AS Liberado
FROM Cliente_Software cs
INNER JOIN Cliente c ON c.Codigo = cs.Codigo_Cliente
LEFT JOIN CTE_SP sp on sp.codigo_software = cs.Codigo_Software
WHERE cs.codigo_cliente = 17041


Espero que ajude


Pra forma acima que postei fica na mesma
Código:
WITH CTE_SP as
(
    SELECT codigo_software, SUM(valor) as valor
    FROM sp_ret_vl_contratos_cli(:CODIGO_CLI, '')
    GROUP BY codigo_software
)

SELECT cs.ID_Cliente_Software AS AZCode,
       cs.Codigo_Cliente AS Customer,
       cs.Codigo_Software AS Product,
       cs.Data_Hora AS Subscription,
       COALESCE(sp.valor, 0) as valor,
  ( SELECT count(*)
   FROM financeiro_contas fc
   WHERE addday(fc.data_vencimento,
                  (SELECT FIRST 1 Dias_Tolerancia
                   FROM Financeiro_Cobranca_Config
                   ORDER BY PK_Financeiro_Cobranca_Config DESC)) <= CURRENT_DATE
     AND fc.data_quitacao IS NULL
     AND fc.cancelado <> 'Sim'
     AND fc.Boleto = 'Sim'
     AND fc.Codigo_Cliente = cs.Codigo_Cliente ) AS QuantidadeParcelas,
       coalesce(c.Data_Limite_Liberacao, cast(addday(CURRENT_DATE, -1) AS date)) AS LiberadoAte,
       coalesce(c.Contrato_Suporte_Liberado, 'Não') AS Liberado
FROM Cliente_Software cs
INNER JOIN Cliente c ON c.Codigo = cs.Codigo_Cliente
LEFT JOIN CTE_SP sp on sp.codigo_software = cs.Codigo_Software
WHERE cs.codigo_cliente = :CODIGO_CLI


Ou seja repete os valores

Citação:
Verifiquei aqui Imex, e as vezes pode trazer mais de um valor no produto sim.

Ai duplicou o valor
Na sp traz assim
Código:
produto----valor-------data-----quantidade
1-------------46,00----11/12/18----------1
1---------46.000,00---15/02/19----------1000


No select ficou
Código:
1-----------46.046,00
1-----------46.046,00

_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Fev 22, 2019 10:50 am    Assunto: Responder com Citação

Se ajudar vou deixar a SP postada, pra ver. Pode modificar o result da SP caso precise.
Código:
create or alter procedure SP_RET_VL_CONTRATOS_CLI (
    CLIENTE_CODIGO integer,
    PONTOS_REVENDA varchar(1))
returns (
    CODIGO_SOFTWARE integer,
    CLIENTE integer,
    VALOR double precision,
    DATA_AQUISICAO date,
    QUANTIDADE integer,
    REAJUSTE double precision,
    VALOR_RECORRENTE double precision,
    VALOR_COPIA_PRIN_ATUAL integer)
as
declare variable VALOR_COPIA_ADIC double precision;
declare variable COD_SOFT integer;
declare variable VALOR_COPIA_PRIN double precision;
declare variable VALOR_TOTAL_CONTRATO double precision;
declare variable CLIENTE_TEMP integer;
declare variable QTDE integer;
declare variable COD_CLIENTE integer;
declare variable DATA date;
declare variable DATA_CONTRATO date;
declare variable DATA_VALOR_REAL date;
declare variable AT_PROVISORIO char(3);
declare variable CONT_SUPORTE char(3);
declare variable PAGA_BOLETO char(3);
declare variable VALOR_BOLETO double precision;
declare variable VALOR_DESCONTO double precision;
declare variable VALOR_COPIA_PRINCIPAL_AZ double precision;
declare variable VALOR_COPIA_ADICIONAL_AZ double precision;
declare variable VALOR_AZ double precision;
declare variable REAJUSTE_RECORENTE double precision;
BEGIN /* Procedure Text */

CLIENTE_TEMP = 0;


FOR
SELECT CS.CODIGO_CLIENTE,
       CS.DATA_HORA,
       CS.QUANTIDADE,
       CS.codigo_software,
       coalesce(C.VALOR_COPIA_PRINCIPAL, 0),
       C.ATENDIMENTO_PROVISORIO,
       C.CONTRATO_SUPORTE_LIBERADO,
       C.DATA_CONTRATO,
       coalesce(C.DESCONTO_CONTRATO, 0),
       coalesce(C.PAGA_BOLETO, 0),
       C.REAJUSTE,
       VB.CLIENTE
FROM CLIENTE_SOFTWARE CS
LEFT JOIN cliente C ON C.CODIGO = CS.CODIGO_CLIENTE,
                       VALORES_BOLETOS VB
WHERE CS.TIPO <> 'Locado'
  AND -- CS.PAGO_ONLINE <> 'S' AND
 CS.CODIGO_SOFTWARE IN
    (SELECT CODIGO
     FROM PRODUTOS
     WHERE SUPORTE_PAGO = 'Sim'
     )
  AND CS.CODIGO_CLIENTE = :CLIENTE_CODIGO --   and CS.PAGO_ONLINE <> 'S'  /* produtos q foram pagos on line nao devem entrar no calculo do valor do contrato mensal */

ORDER BY CS.DATA_HORA INTO :COD_CLIENTE,
                           :DATA_AQUISICAO,
                           :QTDE,
                           :COD_SOFT,
                           :valor_copia_prin,
                           :at_provisorio,
                           :cont_suporte,
                           :DATA_CONTRATO,
                           :VALOR_DESCONTO,
                           :PAGA_BOLETO,
                           :REAJUSTE,
                           :VALOR_BOLETO DO BEGIN IF (at_provisorio = 'Não'
                                                      AND cont_suporte = 'Não'
                                                      AND pontos_revenda <> 'S') THEN DATA_AQUISICAO = CURRENT_DATE;

IF (pontos_revenda = 'S') THEN BEGIN DATA_VALOR_REAL = DATA_CONTRATO;

END ELSE BEGIN IF (:DATA_CONTRATO > :DATA_AQUISICAO) THEN DATA_VALOR_REAL = DATA_CONTRATO;

ELSE DATA_VALOR_REAL = DATA_AQUISICAO;

END
SELECT cp.valor_copia_principal
FROM contrato_precos cp
JOIN produtos p ON p.codigo = cp.codigo_produto
AND p.suporte_pago = 'Sim'
WHERE cp.codigo_produto = :COD_SOFT
  AND cp.data =
    (SELECT max(cp.data)
     FROM contrato_precos cp
     WHERE cp.data <= :data_valor_real
       AND cp.codigo_produto = :COD_SOFT) INTO :valor_copia_prin_atual;

   IF (cod_soft = 1) THEN BEGIN IF (valor_copia_prin_atual > valor_copia_prin) THEN
   BEGIN
     valor_desconto = valor_desconto + (valor_copia_prin_atual - valor_copia_prin);
     valor_copia_prin = valor_copia_prin_atual;
   END

   IF (valor_copia_prin_atual < valor_copia_prin) THEN
   BEGIN
     reajuste = reajuste + (valor_copia_prin - valor_copia_prin_atual);
     valor_copia_prin = valor_copia_prin_atual;
   END
 END
 ELSE
 BEGIN
   valor_copia_prin = valor_copia_prin_atual;

 END --  if (VALOR_PRINCIPAL is not null) then
   --    valor_copia_prin = VALOR_PRINCIPAL;
 IF (CLIENTE_TEMP <> COD_CLIENTE) THEN
 BEGIN
   CLIENTE_TEMP = COD_CLIENTE;
   VALOR_TOTAL_CONTRATO = 0;

   SELECT max(DATA)
     FROM CONTRATO_PRECOS
    WHERE DATA <= :DATA_VALOR_REAL
      AND CODIGO_PRODUTO = :COD_SOFT INTO :DATA;


   SELECT coalesce(VALOR_COPIA_ADICIONAL, 0),
          Coalesce(VALOR_COPIA_ADICIONAL_AZ, 0),
          coalesce(VALOR_COPIA_PRINCIPAL_AZ, 0)
     FROM CONTRATO_PRECOS
    WHERE DATA =:DATA
      AND CODIGO_PRODUTO = :COD_SOFT INTO :VALOR_COPIA_ADIC,
                                      :VALOR_COPIA_ADICIONAL_AZ,
                                      :VALOR_COPIA_PRINCIPAL_AZ;

   IF (pontos_revenda = 'S') THEN BEGIN VALOR_TOTAL_CONTRATO = VALOR_COPIA_PRIN + (VALOR_COPIA_ADIC * (QTDE-1));

valor_AZ = valor_copia_principal_az + (valor_copia_adicional_az * (QTDE-1));

IF (VALOR_DESCONTO IS NOT NULL) THEN BEGIN VALOR_TOTAL_CONTRATO = VALOR_TOTAL_CONTRATO - VALOR_DESCONTO;

valor_AZ = valor_AZ - VALOR_DESCONTO;

END reajuste_recorente = ((reajuste * 100)/valor_total_contrato)/100;

valor_recorrente = VALOR_TOTAL_CONTRATO - valor_AZ;

valor_recorrente = valor_recorrente + (valor_recorrente * reajuste_recorente);

END ELSE BEGIN VALOR_TOTAL_CONTRATO = VALOR_COPIA_PRIN + (VALOR_COPIA_ADIC * (QTDE-1))+ REAJUSTE;

IF (VALOR_DESCONTO IS NOT NULL) THEN VALOR_TOTAL_CONTRATO = VALOR_TOTAL_CONTRATO - VALOR_DESCONTO;

IF (PAGA_BOLETO = 'Sim') THEN VALOR_TOTAL_CONTRATO = VALOR_TOTAL_CONTRATO + VALOR_BOLETO;

END codigo_software = cod_soft;

CLIENTE = CLIENTE_TEMP;

VALOR = VALOR_TOTAL_CONTRATO;

QUANTIDADE = QTDE;

END ELSE BEGIN
SELECT max(DATA)
FROM CONTRATO_PRECOS
WHERE DATA <= :DATA_VALOR_REAL
  AND CODIGO_PRODUTO = :COD_SOFT INTO :DATA;


SELECT VALOR_COPIA_ADICIONAL,
       VALOR_COPIA_ADICIONAL_AZ,
       VALOR_COPIA_PRINCIPAL_AZ
FROM CONTRATO_PRECOS
WHERE DATA =:DATA
  AND CODIGO_PRODUTO = :COD_SOFT INTO :VALOR_COPIA_ADIC,
                                      :VALOR_COPIA_ADICIONAL_AZ,
                                      :VALOR_COPIA_PRINCIPAL_AZ;

IF (pontos_revenda = 'S') THEN BEGIN VALOR_TOTAL_CONTRATO = (VALOR_COPIA_ADIC * QTDE);

valor_AZ = valor_copia_adicional_az * QTDE;

reajuste_recorente = ((reajuste * 100)/valor_total_contrato)/100;

valor_recorrente = VALOR_TOTAL_CONTRATO - valor_AZ;

valor_recorrente = valor_recorrente + (valor_recorrente * reajuste_recorente);

END VALOR_TOTAL_CONTRATO = (VALOR_COPIA_ADIC * QTDE);

codigo_software = cod_soft;

CLIENTE = CLIENTE_TEMP;

VALOR = VALOR_TOTAL_CONTRATO;

QUANTIDADE = QTDE;

END suspend;

END
END

_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Fev 22, 2019 11:16 am    Assunto: Responder com Citação

Não entendi porque na query que postei está sendo feito o agrupamento com Sum por produto. Se você fizer uns testes só com o trecho abaixo deve obter apenas um registro por produto:

Código:
WITH CTE_SP as
(
    SELECT codigo_software, SUM(valor) as valor
    FROM sp_ret_vl_contratos_cli(:Pcodigo_cliente, '')
    GROUP BY codigo_software
)

select * from CTE_SP
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Fev 22, 2019 11:50 am    Assunto: Responder com Citação

imex escreveu:
Não entendi porque na query que postei está sendo feito o agrupamento com Sum por produto. Se você fizer uns testes só com o trecho abaixo deve obter apenas um registro por produto:

Código:
WITH CTE_SP as
(
    SELECT codigo_software, SUM(valor) as valor
    FROM sp_ret_vl_contratos_cli(:Pcodigo_cliente, '')
    GROUP BY codigo_software
)

select * from CTE_SP


Quando rodo sozinho cfe vc postou




Quando junto os 2 select fica assim

_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Fev 22, 2019 12:24 pm    Assunto: Responder com Citação

Mas nesse caso não é a primeira query sem a SP que está retornando mais de um registro para o mesmo produto?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Fev 22, 2019 2:00 pm    Assunto: Responder com Citação

imex escreveu:
Mas nesse caso não é a primeira query sem a SP que está retornando mais de um registro para o mesmo produto?
Pelo visto sim.

Mais a minha ideia é retornar mais de um mesmo só como são seus valores

A imagem acima é o que a SP retorna ao rodar ela.
Assim pode até mostrar neste select não a soma total do mesmo produto nas duas linhas como no outra imagem.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Fev 22, 2019 2:59 pm    Assunto: Responder com Citação

Se você quer os valores separados, acho que você teria que verificar a possibilidade de a SP retornar a chave do registro para poder fazer o Join com a primeira query. Ou então verificar se os campos codigo_software e data_hora juntos duplicam; se não duplicam seria possível fazer o Join da SP na primeira query com esses 2 campos.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Fev 22, 2019 3:12 pm    Assunto: Responder com Citação

imex escreveu:
Se você quer os valores separados, acho que você teria que verificar a possibilidade de a SP retornar a chave do registro para poder fazer o Join com a primeira query. Ou então verificar se os campos codigo_software e data_hora juntos duplicam; se não duplicam seria possível fazer o Join da SP na primeira query com esses 2 campos.


Você diz assim?
Código:
WITH CTE_SP as
(
    SELECT codigo_software,
     data_aquisicao,
     SUM(valor) as valor
    FROM sp_ret_vl_contratos_cli(:CODIGO_CLI, '')
    GROUP BY codigo_software, data_aquisicao
)

SELECT cs.ID_Cliente_Software AS AZCode,
       cs.Codigo_Cliente AS Customer,
       cs.Codigo_Software AS Product,
       cs.Data_Hora AS Subscription,
       COALESCE(sp.valor, 0) as valor,
  ( SELECT count(*)
   FROM financeiro_contas fc
   WHERE addday(fc.data_vencimento,
                  (SELECT FIRST 1 Dias_Tolerancia
                   FROM Financeiro_Cobranca_Config
                   ORDER BY PK_Financeiro_Cobranca_Config DESC)) <= CURRENT_DATE
     AND fc.data_quitacao IS NULL
     AND fc.cancelado <> 'Sim'
     AND fc.Boleto = 'Sim'
     AND fc.Codigo_Cliente = cs.Codigo_Cliente ) AS QuantidadeParcelas,
       coalesce(c.Data_Limite_Liberacao, cast(addday(CURRENT_DATE, -1) AS date)) AS LiberadoAte,
       coalesce(c.Contrato_Suporte_Liberado, 'Não') AS Liberado
FROM Cliente_Software cs
INNER JOIN Cliente c ON c.Codigo = cs.Codigo_Cliente
LEFT JOIN CTE_SP sp on (sp.codigo_software = cs.Codigo_Software AND sp.data_aquisicao = cs.Data_Hora)
WHERE cs.codigo_cliente = :CODIGO_CLI

_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Fev 22, 2019 4:01 pm    Assunto: Responder com Citação

Sem a CTE porque não teria mais que somar/agrupar:

Código:
SELECT cs.ID_Cliente_Software AS AZCode,
       cs.Codigo_Cliente AS Customer,
       cs.Codigo_Software AS Product,
       cs.Data_Hora AS Subscription,
       COALESCE(sp.valor, 0) as valor,
  ( SELECT count(*)
   FROM financeiro_contas fc
   WHERE addday(fc.data_vencimento,
                  (SELECT FIRST 1 Dias_Tolerancia
                   FROM Financeiro_Cobranca_Config
                   ORDER BY PK_Financeiro_Cobranca_Config DESC)) <= CURRENT_DATE
     AND fc.data_quitacao IS NULL
     AND fc.cancelado <> 'Sim'
     AND fc.Boleto = 'Sim'
     AND fc.Codigo_Cliente = cs.Codigo_Cliente ) AS QuantidadeParcelas,
       coalesce(c.Data_Limite_Liberacao, cast(addday(CURRENT_DATE, -1) AS date)) AS LiberadoAte,
       coalesce(c.Contrato_Suporte_Liberado, 'Não') AS Liberado
FROM Cliente_Software cs
INNER JOIN Cliente c ON c.Codigo = cs.Codigo_Cliente
LEFT JOIN sp_ret_vl_contratos_cli(:CODIGO_CLI, '') sp on (sp.codigo_software = cs.Codigo_Software AND sp.data_aquisicao = cs.Data_Hora)
WHERE cs.codigo_cliente = :CODIGO_CLI


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Fev 22, 2019 4:06 pm    Assunto: Responder com Citação

imex escreveu:
Sem a CTE porque não teria mais que somar/agrupar:

Código:
SELECT cs.ID_Cliente_Software AS AZCode,
       cs.Codigo_Cliente AS Customer,
       cs.Codigo_Software AS Product,
       cs.Data_Hora AS Subscription,
       COALESCE(sp.valor, 0) as valor,
  ( SELECT count(*)
   FROM financeiro_contas fc
   WHERE addday(fc.data_vencimento,
                  (SELECT FIRST 1 Dias_Tolerancia
                   FROM Financeiro_Cobranca_Config
                   ORDER BY PK_Financeiro_Cobranca_Config DESC)) <= CURRENT_DATE
     AND fc.data_quitacao IS NULL
     AND fc.cancelado <> 'Sim'
     AND fc.Boleto = 'Sim'
     AND fc.Codigo_Cliente = cs.Codigo_Cliente ) AS QuantidadeParcelas,
       coalesce(c.Data_Limite_Liberacao, cast(addday(CURRENT_DATE, -1) AS date)) AS LiberadoAte,
       coalesce(c.Contrato_Suporte_Liberado, 'Não') AS Liberado
FROM Cliente_Software cs
INNER JOIN Cliente c ON c.Codigo = cs.Codigo_Cliente
LEFT JOIN sp_ret_vl_contratos_cli(:CODIGO_CLI, '') sp on (sp.codigo_software = cs.Codigo_Software AND sp.data_aquisicao = cs.Data_Hora)
WHERE cs.codigo_cliente = :CODIGO_CLI


Espero que ajude
Entendi. Muito obrigado.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Ir à página 1, 2  Próximo
Página 1 de 2

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB