Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Rods2018

Retornar soma de produtos por cliente

Recommended Posts

ta aqui

 

select 
    row_number() over(order by A1_COD) as NUMBER,
    produtos.TOTAL,
    p.A1_COD,
    p.A1_NOME,
    p.A1_VEND,
    p.ULTCOMP_CLIENTE,
    p.B1_COD,
    p.B1_DESC,
    p.B2_QATU,
    p.B2_CM1,
    p.B2_VFIM1,
    p.B2_VATU1,
    p.D2_PRCVEN,
    p.D2_QUANT,
    p.ULTCOMP_PRODUTO_CLIENTE,
    p.TOTAL_MESES from SD2010,
        (select 
            B1_COD,
            count(B1_COD) over(order by B1_COD) as TOTAL 
            from 
                SB1010 
            group by 
                B1_COD) as produtos,
            (select 
                A1_COD,
                A1_NOME,
                A1_VEND,
                A1_ULTCOM as ULTCOMP_CLIENTE,
                B1_COD,
                B1_DESC,
                B2_QATU,
                B2_CM1,
                B2_VFIM1,
                B2_VATU1,
                D2_PRCVEN,
                D2_QUANT,
                max(D2_EMISSAO) as ULTCOMP_PRODUTO_CLIENTE,
                datediff(mm,max(D2_EMISSAO),getdate()) as TOTAL_MESES 
                from 
                SB1010 as SB1
                inner join SD2010 SD2 on D2_COD = B1_COD
                inner join SB2010 SB2 on B2_COD = B1_COD
                inner join SA1010 SA1 on A1_COD = D2_CLIENTE    
            where 
                B2_QATU > 0 
            and 
                (SA1.D_E_L_E_T_ <> '*' 
            and 
                SB1.D_E_L_E_T_ <> '*' 
            and 
                (SB2.D_E_L_E_T_ <> '*' 
            and 
                SD2.D_E_L_E_T_ <> '*' 
            and 
                (B1_TIPO = 'ME' 
            and 
                B1_COD not in
                    (select distinct 
                        D2_COD 
                    from 
                        SD2010      
                    where 
                        D2_FILIAL = 01 
                    and 
                        (D2_EMISSAO between dateadd(mm,-2,getdate()) and  getdate() 
                    and 
                        D2_TIPO = 'N')))))
        group by 
            A1_COD,
            A1_NOME,
            A1_VEND,
            A1_ULTCOM,
            B1_COD,
            B1_DESC,
            B2_QATU,
            B2_CM1,
            B2_VFIM1,
            B2_VATU1,
            D2_QUANT,
            D2_PRCVEN) as p
where 
    p.ULTCOMP_PRODUTO_CLIENTE between dateadd(yyyy,-8,getdate()) and dateadd(mm,-2,getdate()) 
and 
    p.B1_COD = produtos.B1_COD
group by 
    p.ULTCOMP_PRODUTO_CLIENTE,
    p.TOTAL_MESES,
    p.A1_COD,
    produtos.TOTAL,
    p.A1_NOME,
    p.A1_VEND,
    p.ULTCOMP_CLIENTE,
    p.B1_COD,
    p.B1_DESC,
    p.B2_QATU,
    p.B2_CM1,
    p.B2_VFIM1,
    p.B2_VATU1,
    p.D2_PRCVEN,
    p.D2_QUANT
order by 3,7 desc;

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim é só trazer de uma tabela os dois campos mas so to com um problema que por causa do group by ou quando faço uma subquery pra retoranar estes valores os valores do count se alteram...

Compartilhar este post


Link para o post
Compartilhar em outros sites

consegui chegar no resultado que queria antes mas quando coloco o campo D2_QUANT e o D2_PRCVEN os resultados do count se alteram por que esses campos retornam muitos valores distintos

 

select 
    produtos.NUMBER,
    names.A1_COD,
    names.A1_NOME,
    names.A1_VEND,
    produtos.ULTCOMP_CLIENTE,
    produtos.B1_COD,
    produtos.TOTAL_VEZES,
    produtos.B1_DESC,
    produtos.B2_QATU,
    produtos.B2_CM1,
    produtos.B2_VFIM1,
    produtos.B2_VATU1,
    produtos.ULTCOMP_PRODUTO_CLIENTE,
    produtos.TOTAL_MESES 
from
    (select 
        A1_COD,
        A1_NOME,
        A1_VEND 
    from 
        SA1010 
    group by 
        A1_COD,
        A1_NOME,
        A1_VEND) as names,
        (select 
            row_number() over(order by A1_COD) as NUMBER,
            A1_COD,
            A1_ULTCOM as ULTCOMP_CLIENTE,
            B1_COD,
            B1_DESC,
            B2_QATU,
            B2_CM1,
            B2_VFIM1,
            B2_VATU1,
            count(B1_COD) as TOTAL_VEZES,
            max(D2_EMISSAO) as ULTCOMP_PRODUTO_CLIENTE,
            datediff(mm,max(D2_EMISSAO),getdate()) as TOTAL_MESES  
        from 
            SB1010 SB1
            inner join SD2010 SD2 on D2_COD = B1_COD
            inner join SB2010 SB2 on B2_COD = B1_COD
            inner join SA1010 SA1 on A1_COD = D2_CLIENTE
        where 
            B2_QATU > 0 
        and 
            (D2_EMISSAO between dateadd(yyyy,-8,getdate()) and dateadd(mm,-2,getdate()) 
        and 
            SA1.D_E_L_E_T_ <> '*' 
        and     
            (SB1.D_E_L_E_T_ <> '*' 
        and 
            SB2.D_E_L_E_T_ <> '*' 
        and 
            (SD2.D_E_L_E_T_ <> '*' 
        and 
            B1_TIPO = 'ME' 
        and 
            (B1_COD not in(
                        select 
                            distinct D2_COD from SD2010      
                        where 
                            D2_FILIAL = 01 
                        and 
                            (D2_EMISSAO between dateadd(mm,-2,getdate()) and  getdate() 
                        and 
                            D2_TIPO = 'N'))))))
        group by 
            A1_COD,
            A1_ULTCOM,
            B1_COD,
            B1_DESC,
            B2_QATU,
            B2_CM1,
            B2_VFIM1,
            B2_VATU1) as produtos
where 
    names.A1_COD = produtos.A1_COD
order by 2 desc

 

esta query retorna isto...

image.thumb.png.cf15c924f03c989c965599d1846d24c0.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por FabianoSouza
      Preciso corrigir o erro "Somente uma expressão pode ser especificada na lista de seleção quando a subconsulta não é introduzida com EXISTS." da minha consulta.
      SELECT TA.titulo AS 'Trilha' , (SELECT CAST(ROUND((Comportamental * 100.0) / (Comportamental + Técnico), 2) AS DECIMAL(5,1)) AS Comportamental ,CAST(ROUND((Técnico * 100.0) / (Comportamental + Técnico), 2) AS DECIMAL(5,1)) AS Técnico FROM ( SELECT SUM(CASE WHEN dbo.tabB.enfoque = '1' THEN 1 ELSE 0 END) AS Comportamental, SUM(CASE WHEN dbo.tabB.enfoque = '2' THEN 1 ELSE 0 END) AS Técnico, COUNT(*) AS Total FROM dbo.tabB ) tab ) FROM dbo.tabA AS TA Nessa consulta, preciso trazer o título (da tabA) e o resultado de um cálculo feito na subconsulta, nos campos Comportamental e Técnico.
    • Por JoãoNeto2
      Eu estava usando um programa em PHP que conectava e lia um banco de dados SQL Server. Do nada ele parou de funcionar apresentando a seguinte mensagem :
      O cliente não pode estabelecer conexão porque foi encontrado um erro durante os handshakes anteriores ao logon. As causas comuns incluem a tentativa do cliente de conectar-se a uma versão sem suporte do SQL Server, o servidor muito ocupado para aceitar novas conexões ou uma limitação de recursos (memória ou máximo de conexões permitidas) no servidor.
      Algumas informações para esclarecer :
      1-Consigo conectar o banco via Dbeaver da própria máquina que o programa PHP deixou de funcionar
      2-De outra máquina consigo conectar esse mesmo banco com o mesmo programa PHP
      3-Essa mesma máquina conecta outro banco SQL Server de outro cliente
      Ou seja, o mesmo programa conecta o mesmo banco mas de outra máquina e a mesma máquina consegue conectar outro banco SQL.
      O que pode ser?
    • Por mamotinho
      Olá, pessoal mais uma vez venho pedi a ajuda de vocês estou com um problema ao roda uma query que montei, eu sou iniciante na area e não tenho muito conhecimento então o codigo que fiz foi parte de meu conhecimento básico. bom o que eu quero resolver nessa query é o seguinte, eu quero consultar uma tabela e nela pega todos os registros com a a data vencida e lista ela dentro do while em seguida retornar dentro desse if o valor da coluna de cada uma exemplo de como fiz e ficou com loop infinito.

       
      declare @id int declare @getdate datetime select @id = IDCadastrado, @getdate = RegDate from BancoTeste.dbo.MinhaTabela where RegDate < getdate() while @id is not null begin select * from BancoTeste.dbo.MinhaTabela where IDCadastrado = @id end quando eu executo isso ai ele executa infinitamente o valor do primeiro registro repetidamente.
    • Por rdavisp
      Senhores, recorro a ajuda de vocês pois venho do banco de dados Oracle e tenho encontrado certa dificuldade para trabalhar com o SQL Server 2012, mais especificamente com a linguagem Transact-SQL. Pelo o que eu tenho percebido, não se trata de uma linguagem fortemente tipada em relação ao gerenciamento de escopo de variáveis. Exemplo, como as variavéis de cursores, que caso a primeira interação atribua valores válidos para as variáveis e caso na segunda volta do looping seja retornado nulo é mantido o valor da primeira interação. Outra coisa que eu estou tentando entender é o fato da seguinte query dentro de um bloco não retornar resultado dinamincamente na execução:
      SELECT @IDSALAMODELO = SM.ID
            ,@NOMEGRUPO    = G.NOME
        FROM CRT C
            ,GRUPO G
            ,SALAMODELO SM
            ,EMPRESA E
       WHERE C.IDGRUPO      = G.ID
         AND G.IDSALAMODELO = SM.ID
         AND SM.IDEMPRESA   = E.ID
         --
         AND C.ID       = CAST(@CRT AS INT)
         AND C.ATIVO    = @ATIVO
         AND G.ATIVO    = @ATIVO
         AND G.IDINTAKE = @INTAKEATUAL
         AND E.ID       = @IDEMPRESA
      E quando a executo numa janela de consulta com os parametros hardcode ela me retorna resultado. Não estou limpando elas em momento algum e ja tentei deixar os valores hardcode dentro do bloco, mas ainda assim, o resultado permance o mesmo, ou seja, não me retorna resultado.
      Por isso, se possível, gostaria da opinião de vocês para que eu posso solucionar esse problema.
      Grato.
    • Por Bruno_Sam
      Preciso buscar em todas as tabelas do banco um nome de cliente. Não sei quais tabelas contem o nome desse cliente e preciso pois esta errado o nome. Existe algum select que faça busca de um valor em todas as tabelas e fala quais estão???
       
      Obs:Não posso criar tabela temporaria no banco.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.