Jump to content
Rods2018

Retornar soma de produtos por cliente

Recommended Posts

Olá estou com o seguinte desafio esta query 

 

select row_number() over(order by A1_COD) as NUMBER,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 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())
group by p.ULTCOMP_PRODUTO_CLIENTE,p.TOTAL_MESES,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
order by 2,6 desc;

 

retorna o seguintes valores
1    000000    CLIENTE PADRAO                              000001    20161205    95002              PESO ADES BAIXO 5/10 60 EMB 50 3M           213    30,5    7869    6496,5    35    3    20100319    95
2    000000    CLIENTE PADRAO                              000001    20161205    95002              PESO ADES BAIXO 5/10 60 EMB 50 3M           213    30,5    7869    6496,5    24    4    20100728    91
3    000000    CLIENTE PADRAO                              000001    20161205    95002              PESO ADES BAIXO 5/10 60 EMB 50 3M           213    30,5    7869    6496,5    26    3    20100812    90
4    000000    CLIENTE PADRAO                              000001    20161205    95002              PESO ADES BAIXO 5/10 60 EMB 50 3M           213    30,5    7869    6496,5    27    4    20110331    83
5    000000    CLIENTE PADRAO                              000001    20161205    95002              PESO ADES BAIXO 5/10 60 EMB 50 3M           213    30,5    7869    6496,5    45    1    20111028    76
6    000000    CLIENTE PADRAO                              000001    20161205    95002              PESO ADES BAIXO 5/10 60 EMB 50 3M           213    30,5    7869    6496,5    35    1    20120316    71

 

queria fazer o seguinte somar em uma outra coluna chamada total, onde ele somasse todos os codigos do produtos que forem iguais e forem do mesmo cliente nesta coluna, mas quando eu faço isso ele soma de outros registros que nao aparecem neste select ficando assim

 

OBS: TOTAL é a segunda coluna

 

1    1    000000    CLIENTE PADRAO                              000001    20161205    95002              PESO ADES BAIXO 5/10 60 EMB 50 3M           213    30,5    7869    6496,5    35    3    20100319    95
2    1    000000    CLIENTE PADRAO                              000001    20161205    95002              PESO ADES BAIXO 5/10 60 EMB 50 3M           213    30,5    7869    6496,5    24    4    20100728    91
3    1    000000    CLIENTE PADRAO                              000001    20161205    95002              PESO ADES BAIXO 5/10 60 EMB 50 3M           213    30,5    7869    6496,5    26    3    20100812    90
4    1    000000    CLIENTE PADRAO                              000001    20161205    95002              PESO ADES BAIXO 5/10 60 EMB 50 3M           213    30,5    7869    6496,5    27    4    20110331    83
5    1    000000    CLIENTE PADRAO                              000001    20161205    95002              PESO ADES BAIXO 5/10 60 EMB 50 3M           213    30,5    7869    6496,5    45    1    20111028    76
6    5    000000    CLIENTE PADRAO                              000001    20161205    95002              PESO ADES BAIXO 5/10 60 EMB 50 3M           213    30,5    7869    6496,5    35    1    20120316    71

 

usei o count com o group by mas nao adianta alguem teria alguma solução pensei em fazer um laço mas nao sei se tem como pegar o valor do campo pela posição tentei fazer mas não consegui.

Share this post


Link to post
Share on other sites

 

Citar

queria fazer o seguinte somar em uma outra coluna chamada total, onde ele somasse todos os codigos do produtos que forem iguais e forem do mesmo cliente nesta coluna, mas quando eu faço isso ele soma de outros registros que nao aparecem neste select ficando assim

 

Use a clausula OVER

Deve te ajudar

Share this post


Link to post
Share on other sites

Difícil pois não conheço a síntaxe do SQL SERVER , mas uso estas "analytic functions" do Oracle.

 

 

Share this post


Link to post
Share on other sites

os codigos dos produtos ex : este cliente da tabela comprou 6 x este produto ou seja quantas vezes o produto aparece na query.. Como são muitos registros retornados, precisaria de uma condição

Share this post


Link to post
Share on other sites

ja coloquei olha  como ele retorna..

 

TOTAL  é  a 6 coluna(Retornou tudo como 1)

fiz assim count(distinct B1_COD)

 

1    000000    CLIENTE PADRAO                              000001    20161205    1    00788              CAMARA MOTO MJ-18 MAGION          1    17,51    17,51    17,51    15,8    1    20100226    96
2    000000    CLIENTE PADRAO                              000001    20161205    1    01000              CAMARA MOTO MG-18 MAGION          1    15    15    15    13    1    20100226    96
3    000000    CLIENTE PADRAO                              000001    20161205    1    00722              CAMARA AUTOM RG-13 MAGION         1    15    15    15    16,8    2    20100309    95
4    000000    CLIENTE PADRAO                              000001    20161205    1    95002              PESO ADES BAIXO 5/10 60 EMB 50 3M           213    30,5    7869    6496,5    35    3    20100319    95
5    000000    CLIENTE PADRAO                              000001    20161205    1    01438              EXT FLEXIVEL 210 MM               599    3,5522    1810,67    2127,74    10    3    20100326    95
6    000000    CLIENTE PADRAO                              000001    20161205    1    00647              GRAFITE SPRAY                               35    4,0486    141,7    141,7    4,5    1    20100412    94

Share this post


Link to post
Share on other sites

ta aqui a query...

 

select 
    row_number() over(order by A1_COD) as NUMBER,
    p.A1_COD,p.A1_NOME,p.A1_VEND,p.ULTCOMP_CLIENTE,
    p.TOTAL,
    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 
            A1_COD,
            A1_NOME,
            A1_VEND,
            A1_ULTCOM as ULTCOMP_CLIENTE,
            count(B1_COD) as TOTAL,
            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())
group by 
    p.ULTCOMP_PRODUTO_CLIENTE,
    p.TOTAL_MESES,
    p.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
order by 
    2,6 
desc;
 

Share this post


Link to post
Share on other sites

Não entendi muito bem o que você quer fazer, seria agrupar e adicionar uma coluna com a soma?

 

Seria interessante se você colocasse uma print da saída que você tem e da saída que você quer (feita no paint ou excel).

 

Talvez fosse interessante colocar o Modelo também (para o pessoal entender uma pouco o que acontece).

Share this post


Link to post
Share on other sites

o que a query retorna

 

OBS: Tem mais linhas mas peguei este cliente como exemplo

image.thumb.png.87726e2c078cc51c4a6aa4445db1be04.png

 

continuação do resultado acima..

image.png.668b56300eda34b306ba21542ef42c6d.png

 

o que eu quero...

 

image.thumb.png.c11d85becf02f2c6149124ace8c89096.png

 

OBS: So que em vez de aparecer  1 no total queria que quando o produto x = a este codigo do produto ele verificasse quantos clientes compraram este produto no geral, somando no campo total a quantidade de clientes...

 

espero ter conseguido esclarecer.

Share this post


Link to post
Share on other sites

O problema é que você está agrupando com valores diferentes (acredito eu).

Ex:

Tabela clientes

image.png.db20173bb76b890ae0c1740068a73213.png

 

Select com count e group by com todas as colunas

SELECT id,nome,count(nome),qtd, col_dif FROM `clientes` GROUP BY id,nome,qtd, col_dif

Saída:

image.png.d190a0e068c14821cf3f10c919e1f23c.png

Ou seja foi agrupado por id, nome, qtd, col_dif, com exceção do nome, todas as outras colunas possuem valores diferentes.

Você está agrupando todos os valores do group by que são iguais por isso o count resulta em "1".

 

Dessa outra maneira o select contou e agrupou somente os iguais:

SELECT nome,count(nome) FROM `clientes` GROUP BY nome

Saída:

image.png.9e424842247f5e73ba456acd5a1021d5.png

 

Caso você queira apenas adicionar uma coluna count e deixar os demais valores faça uma subquery

SELECT c.id,c.nome,c.qtd,c.col_dif, X1.contador 
FROM clientes c,
(SELECT nome,count(nome) as contador FROM `clientes` GROUP BY nome) X1
where c.nome = X1.nome

Saída com a coluna count sem interferir nos outros valores:

image.png.b5d10c3241f553b3ab4f0d3a1d425aff.png

Comparação (tabela clientes)

image.png.db20173bb76b890ae0c1740068a73213.png

 

Não sei se deu para entender a lógica da coisa.

Share this post


Link to post
Share on other sites
34 minutos atrás, Rods2018 disse:

Sim kim.y consegui entender a logica mas não estou conseguindo aplicar na minha query pois esta dando erro, teria como mostrar onde se encaixaria esta subquery?

Puts aplicar isso na sua query eu não sei, até porque é coisa do seu projeto, só você sabe o que está acontecendo.

 

Por exemplo, você quer contar quantos clientes compram determinado produto?

subquery:

select produto,cliente,count(produto) from tabela2 group by produto,cliente

E aí no where geral você coloca tabela1.produto = tabela2.produto

 

Algo assim.

 

edit:

Coloca sua query normal sem count, sem sum, sem nada, só com as colunas que você quer, para sair a saída completa e a gente vai filtrando o que você quer.

 

quando for colocar o código, na barra de formatação clique em "<>" e cole o código lá.

Share this post


Link to post
Share on other sites
6 minutos atrás, kim.y disse:

Puts aplicar isso na sua query eu não sei, até porque é coisa do seu projeto, só você sabe o que está acontecendo.

 

Por exemplo, você quer contar quantos clientes compram determinado produto?

subquery:


select produto,cliente,count(produto) from tabela group by produto,cliente

E aí no where geral você coloca tabela1.produto = tabela2.produto

 

Algo assim.

blz kim acho que ja deu uma luz, vlw qualquer coisa volto aqui de novo... Consegui colocar mas agora vou ter que fazer umas condições dentro desta subquery

Share this post


Link to post
Share on other sites

Explicando a OVER , vamos supor que se queira total de produtos x vendedores , nesta ordem ,

um simples group by totalizaria por produtos e vendedores , mas a OVER permite um total acumulado por vendedor.

 

Share this post


Link to post
Share on other sites

Entao consegui implementar, mas olha oq acontece sem o group by a query retorna isso..

 

image.thumb.png.f2c0ed76364eae17a2fbe88342961512.png

 

Fica executando e nao para,e retorna só um cliente

 

com o group by..

 

image.thumb.png.95f4b553d37bf5af742834e3109bd365.png

 

retorna certinho porem so falta agora somar a coluna total.. 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By tondovale12
      Já resolvi o problema. Obrigado.
      Não vi uma opção de excluir o tópico, então editei antes de ser aprovado.
    • By 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.
    • By wellfc12
      Olá boa noite sou novo neste fórum, estou procurando ajuda pois não sei com eu poderia fazer. Estou modelando um banco de dados e agora cheguei a um ponto que não sei como fazer. 
      Preciso criar uma tabela que registre a movime tacacao de pessoas que iram passar na entrada da empresa, porém quando eu crio o relacionamento desta nova tabela com tabela pessoa para garantir integridade de quem é a pessoa que está entrando ou saída da empresa eu consigo, mas eu preciso também registrar o usuário (porteiro) que está registrando essa movimentação. A minha tabela de pessoas se relaciona com o usuário, pois uma pessoa cadastrada no sistema não necessariamente precisa ter um usuário, mas um usuário pra ter acesso ao sistema e necessário tar cadastrado na tabela pessoas. Quando vou relacionar na nova tabela que a pessoa quem passou é cod 2 exemplo eu preciso registrar qual é usuário quem registrou isso que poderia ser o cod 10 (cod o usuário, que do porteiro que tbm esta cadastrado no sistema) 
       
      Isso pode ser até uma coisa besta mas eu não sei como posso nesta ocasião. 
      Obrigado! 
       
      Anexo coloquei a imagem de uma modelagem que estou fazendo. 
       

    • By GuiPetenuci
      Boa tarde,
      Estou com um problema e estou ficando louco, ja li praticamente todos as respostas de View de SQL Server no Stack Overflow e a maioria da documentacao da MSFT
       
      Tenho uma view que faz algumas queries malucas que o cliente precisa, mas ela nao retorna o resultado justo, e se eu pegar o codigo e fazer uma query simples com o codigo, o resultado è ok.
       
      Codigo da View
      SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /****** Object:  View [QEHS].[V_FactMonitorings25261gui]    Script Date: 11/07/2019 16:24:53 ******/ CREATE view      [QEHS].[V_FactMonitorings25261gui] as      with     Plants as      (         select distinct              [plant-id]          from              [QEHS].[Fact-Monitorings-H&S]                 ) ,      MIDs as      (         select mid          from          (             values                 ( 'MON.02.25 Total number of LTA free days (calendar days)')                 ,( 'MON.02.26 Total number of TRI free days (calendar days)')          ) as x(mid)      ),      PlantList      AS     (         select              a.date,              b.[plant-id],              c.mid         from              QEHS.Calendar_Gen A              cross join              plants b                 cross join mids c         where              year(a.date) >= 2011     ),      help1 as      (         SELECT              p.date,              p.[plant-id],             p.mid,              t.value,             (             case                  when (year(p.date) = year(getdate()) and month(p.date) = month(getdate())) then                      day(getdate())                  else                      iif(t.value is not null, 0, day(eomonth(p.date)))                             end                           ) Days,              cast(isnull(cast(t.value as bit),0) as integer) reset          FROM              PLANTLIST p              left join              [QEHS].[Fact-Monitorings-H&S] T             on             (                  p.date = t.date and                   p.[plant-id] = t.[plant-id] and                   p.mid = t.[monitoring-id]              )                  ),      help2 as      (         select              date,              [plant-id],              mid,              value,              days,              reset,             formatmessage('%s%s%d', [plant-id], mid,sum(reset) over                  (                      partition by  [plant-id], mid                      order by  date, [plant-id], mid                 )             ) grp         from             help1          where              year(date) >= (select year(min(date)) from [QEHS].[Fact-Monitorings-H&S])             ),     help3 as      (         select              date,              [plant-id],              mid,              value,              days,              first_value(value) over (partition by grp order by date, [plant-id], mid) fullvalue         from              help2      )      --      select          date,          [plant-id],          mid,          isnull(a.Value,              fullvalue +sum(days) over              (                  partition by [plant-id], mid, fullvalue                   order by  mid, date, [plant-id]                  rows between unbounded preceding and current row             )          ) total     from          help3 a          GO a view retorna assim:

       
      Agora se eu pegar e fazer a query "na mao", retorna assim, que è o justo:

       
      Agora, porque na view retorna um e a query retorna outro? o.o
    • By RICARDOVS
      Estou tentando rodar a consulta abaixo, porém está dando o erro "Sintaxe incorreta próxima à palavra-chave 'where'". Poderiam me ajudar?
       
          SELECT '3. CONTAS BANCARIAS' as OPERACAO,
                  SBC.REFERENCIA as DTVENC,
                  CTA.CODCTABCOINT COD,
                  CTA.DESCRICAO,
                  SANKHYA.OBTEM_SALDO_BANCO_TGFMBC(SBC.CODCTABCOINT,convert(DATETIME, :DTSALDO)+1) as SALDODODIA,
                  SANKHYA.OBTEM_SALDO_BANCO_TGFMBC(SBC.CODCTABCOINT,convert(DATETIME, :DTSALDO)+1) as SALDOFIN
             FROM TGFSBC SBC,TSICTA CTA
            WHERE SBC.CODCTABCOINT=CTA.CODCTABCOINT
              AND SBC.REFERENCIA=(SELECT MAX(SBC2.REFERENCIA) from TGFSBC SBC2 where SBC2.CODCTABCOINT=CTA.CODCTABCOINT)
              AND CTA.AD_EXIBE_BI='S'
      UNION ALL
          select *
            from (select '1. CAMBIAL PENDENTE' AS OPERACAO,
                          MAX(FIN.DTVENC) AS DTVENC,
                          NAT.CODNAT AS COD, 
                          nat.descrnat AS DESCRICAO,  
                          sum(VLRCAMBIAL) AS SALDODODIA,
                          sum(vlrdesdob) as SALDOFIN
                      from tgffin FIN JOIN AD_CAMBIAL CAM ON (CAM.NUFIN=FIN.NUFIN)
                          join tgfnat nat on (nat.codnat=fin.codnat)
                    where CAM.TIPO='P' group by nat.descrnat, NAT.CODNAT, '1. CAMBIAL PENDENTE') s
          where :OPERACAO='1. CAMBIAL PENDENTE'
      UNION ALL
          select *
            from (select '2. CAMBIAL DISPONIVEL' AS OPERACAO,
                          MAX(FIN.DTVENC) AS DTVENC,
                          NAT.CODNAT AS COD, 
                          nat.descrnat AS DESCRICAO,  
                          sum(VLRCAMBIAL) AS SALDODODIA,
                          sum(vlrdesdob) as SALDOFIN
                      from tgffin FIN JOIN AD_CAMBIAL CAM ON (CAM.NUFIN=FIN.NUFIN)
                          join tgfnat nat on (nat.codnat=fin.codnat)
                    where CAM.TIPO='D' group by nat.descrnat, NAT.CODNAT, '2. CAMBIAL DISPONIVEL') s
          where :OPERACAO='2. CAMBIAL DISPONIVEL'
      UNION ALL
          select *
            from (select '4. MOVIMENTO' AS OPERACAO,
                          MAX(FIN.DTVENC) AS DTVENC,
                          NAT.CODNAT AS COD, 
                          nat.descrnat AS DESCRICAO,  
                          sum(fin.vlrdesdob*fin.recdesp) AS SALDODODIA,
                          sum(fin.vlrdesdob*fin.recdesp) AS SALDOFIN
                      from tgffin FIN join tgfnat nat on (nat.codnat=fin.codnat)
                          INNER JOIN TGFTOP TOC ON (FIN.CODTIPOPER = TOC.CODTIPOPER AND FIN.DHTIPOPER = TOC.DHALTER)
                          LEFT JOIN AD_CAMBIAL CAM ON (CAM.NUFIN=FIN.NUFIN) AND TOC.DHALTER = (SELECT MAX(TOC.DHALTER) FROM TGFTOP TOC WHERE FIN.CODTIPOPER= TOC.CODTIPOPER) AND TOC.GRUPO<>:ADIANTAMENTOS
                  where  (FIN.DHBAIXA is null)
                  AND FIN.CODEMP IN :EMPRESA
                  AND (FIN.PROVISAO<>:PROVISAO)
                  AND (FIN.CODTIPTIT<>19 AND FIN.CODTIPTIT<>20 AND FIN.CODTIPTIT<>21)
                  and FIN.DTVENC=:DIA
                  group by nat.descrnat, NAT.CODNAT, '4. MOVIMENTO')
          where :OPERACAO='4. MOVIMENTO'
       
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.