none
Contar Registros diferentes RRS feed

  • Pergunta

  • Senhores Boa Tarde!!!!

     

    Estou tentando montar uma query no meu aplicativo em VB.NET, mas estou enfrentando dificuldades... O que eu preciso: de um resultset onde conta uma quantidade de CPFs e contar uma quantidade de contratos, e determinar as faixas de atraso... (tenho um campo Dias_Atraso para isso, e uso um CASE para classificar)...

     

    A minha tabela está assim (Ex.):

     

    CPF          Contratos          Dias_Atraso

    123            xyz                  100

    123            qwe                  110

    123            asd                   120

    345            ghj                    200

    345            yui                    210

    234            wer                   311

     

     

    Para cálcular a minha quantidade de CPFs e quantidade de Contratos, num range de faixas e agrupar pelo range da faixas, algo assim:

     

    QTD_CPF          QTD_Contratos            FAIXAS_DE_ATRASO

    1                        3                                Menor que 200 dias

    2                        2                                Entre 200 e 300 dias

    1                        1                                Maior que 300 dias

     

     

    Será que é possível jogar tudo num ResultSet só?

     

    Fico agradecido desde já...


    terça-feira, 8 de abril de 2008 16:03

Todas as Respostas

  • Boa Tarde,

     

    Como é que você define as faixas de atraso ? Há alguma tabela auxiliar ?

     

    [ ]s,

     

    Gustavo

     

    terça-feira, 8 de abril de 2008 16:10
  • Gustavo,

     

    Uso o CASE para determinar as faixas... A query que eu uso é mais ou menos assim:

     

    CASE WHEN DIAS_ATRASO BETWEEN
                          1 AND 120 THEN '< 120' WHEN DIAS_ATRASO BETWEEN 121 AND 150 THEN '121-150' WHEN DIAS_ATRASO BETWEEN 151 AND
                          180 THEN '151-180' WHEN DIAS_ATRASO BETWEEN 181 AND 360 THEN '181-360' WHEN DIAS_ATRASO BETWEEN 361 AND
                          540 THEN '361-540' WHEN DIAS_ATRASO BETWEEN 541 AND 720 THEN '541-720' WHEN DIAS_ATRASO BETWEEN 721 AND
                          1080 THEN '721-1080' WHEN DIAS_ATRASO > 1081 THEN '> 1081' ELSE ' ' END AS FAIXAS_DE_ATRASO

     

    Assim eu crio a coluna FAIXAS_DE_ATRASO...

     

    Grato...

    terça-feira, 8 de abril de 2008 16:20
  •  

    o ideal e criar uma funcao que reotne uma table com os ranges assim vc. pode colocar no join como no exemplo abaixo

     

     

      Declare @Ranges Table (RangeName Varchar(10), RangeStart Int, RangeEnd Int)

      Insert into @Ranges ( RangeName, RangeStart, RangeEnd) Values ('de 0 a 10', 0, 10)
      Insert into @Ranges ( RangeName, RangeStart, RangeEnd) Values ('de 11 a 20', 11, 20)
      Insert into @Ranges ( RangeName, RangeStart, RangeEnd) Values ('de 21 a 30', 21, 30)


      -- Tabela Exemplo
     
    /*
       Create Table #Exp (Valor int)

       Insert into #Exp (Valor) Values (0)
       Insert into #Exp (Valor) Values (5)
       Insert into #Exp (Valor) Values (10)
       Insert into #Exp (Valor) Values (15)
       Insert into #Exp (Valor) Values (20)
       Insert into #Exp (Valor) Values (20)
    */


       Select Range.RangeName, Sum (Case When #Exp.Valor Is null then 0 else 1 End) As Qtd
       From @Ranges Range  Left Join #Exp On #Exp.Valor Between Range.Rangestart And Range.RangeEnd
       Group by  Range.RangeName


     

     

    qq coisa retorne.

     

    Abs;

    terça-feira, 8 de abril de 2008 16:38
  • Marcelo

     

    O meu problema não está em determinar o Range de FAIXAS_ATRASO, mas gostei da solução...

     

    O meu problema está em contar os meus registros e agrupa-los por FAIXAS_ATRASO...

     

    Eu consigo contar Contratos e Agrupa-los por Faixa de atraso, mas eu não consigo Contar os meus CPFs e agrupa-los por faixa de atraso... (Já que um CPF pode ter mais que um contrato...portanto, terei mais de um CPF repetido em minha tabela)

     

    Mas mesmo assim, gostei mesmo da solução...

     

     

    Obrigado!!!!

    terça-feira, 8 de abril de 2008 17:07
  •  

    o que eu costumo fazer neste caso e agrupar o cpf pela conta mais atrasa e depois dividir ela por faixas. nao tem com contar unicamente se nao fizer assim

     

    Abs;

    terça-feira, 8 de abril de 2008 17:13
  • E quanto aos contratos? como que eu adaptaria a minha Query nesse caso?

     

     

    SELECT COUNT(NUMERO_DO_CONTRATO) AS QTD_CONTRATOS, COUNT(CPF_CNPJ_DEVEDOR) AS QTD_CPF,

     SUM(VL_SALDO_PARCELA) AS TOTAL_SALDO_PARCELA,

     

    CASE WHEN DIAS_ATRASO BETWEEN 1 AND 120 THEN '< 120'

    WHEN DIAS_ATRASO BETWEEN 121 AND 150 THEN '121-150'

    WHEN DIAS_ATRASO BETWEEN 151 AND 180 THEN '151-180'

    WHEN DIAS_ATRASO BETWEEN 181 AND 360 THEN '181-360'

    WHEN DIAS_ATRASO BETWEEN 361 AND 540 THEN '361-540'

    WHEN DIAS_ATRASO BETWEEN 541 AND 720 THEN '541-720'

    WHEN DIAS_ATRASO BETWEEN 721 AND 1080 THEN '721-1080'

    WHEN DIAS_ATRASO > 1081 THEN '> 1081' ELSE ' ' END AS FAIXAS

    FROM Politicas

    GROUP BY CASE WHEN DIAS_ATRASO BETWEEN 1 AND 120 THEN '< 120' WHEN DIAS_ATRASO BETWEEN 121 AND

    150 THEN '121-150' WHEN DIAS_ATRASO BETWEEN 151 AND 180 THEN '151-180' WHEN DIAS_ATRASO BETWEEN 181 AND

    360 THEN '181-360' WHEN DIAS_ATRASO BETWEEN 361 AND 540 THEN '361-540' WHEN DIAS_ATRASO BETWEEN 541 AND

    720 THEN '541-720' WHEN DIAS_ATRASO BETWEEN 721 AND 1080 THEN '721-1080' WHEN DIAS_ATRASO > 1081 THEN '> 1081' ELSE ' ' END

    ORDER BY FAIXAS

     

    Não imagino como adaptar..... Sad

     

    Obrigado!!

    terça-feira, 8 de abril de 2008 17:24
  •  

    tente colocar COUNT( DISTINCT CPF_CNPJ_DEVEDOR)  ..

     

     

    Abs;

    terça-feira, 8 de abril de 2008 17:33
  • Os valores do COUNT(DISTINCT CPF_CNPJ_DEVEDOR) não batem....

    Eu testei através do Auto-Filtro do Excel...(Eu tenho a planilha em Excel que seria daonde vem os dados de origem) e comparei (usei a função cont. num ou cont. valores do Excel) e as quantidades por faixa não batem...

     

    O que o Distinct faz?

     

    Obrigado...

    terça-feira, 8 de abril de 2008 18:05
  • Olá Jeff,

     

    Ainda não entendi esse lógica. No seu exemplo

     

    CPF          Contratos          Dias_Atraso

    123            xyz                  100

    123            qwe                  110

    123            asd                   120

    345            ghj                    200

    345            yui                    210

    234            wer                   311

     

    -----------------

     

    QTD_CPF          QTD_Contratos            FAIXAS_DE_ATRASO

    1                        3                                Menor que 200 dias

    2                        2                                Entre 200 e 300 dias

    1                        1                                Maior que 300 dias

     

    Temos 3 CPFs menores que 200, 2 entre 200 e 300 e um acima de 300 dias. Se formos eliminar a repetição (é o mesmo CPF), temos 1 CPF menor que 200 (o 123), 1 CPF entre 200 e 300 (o 345) e um CPF acima de 300 (o 234). Como é que a consulta pode retornar 1, 2 e q na coluna de CPF ?

     

    [ ]s,

     

    Gustavo

    terça-feira, 8 de abril de 2008 19:05
  • Gustavo

     

    Seria 3 Contratos que tem as Faixas de atraso menores que 200 dias (tudo no mesmo CPF), 2 Contratos entre 200 e 300 dias (Tudo no mesmo CPF) e um Contrato com faixa de atraso acima de 300 dias...

     

    Ele retorna 1, 2 na coluna CPF, pq o que separa na hora de contar os CPFs e os Contratos é a Faixa de dias é a Faixa de Dias, e não o próprio CPF ou o Contrato...

     

    Tudo isso fica na mesma tabela (Como vc pode ver na Query acima), Eu tentei usar uma Sub-Query mas sem sucesso...Talvez eu não saiba usar... Sad

     

     

     

    terça-feira, 8 de abril de 2008 19:46
  • Jeff_Lee,

     

    fiquei meio confuso com a tabela dos dados brutos que você encaminhou como modelo. Suspeito que um dos CPFs iformado esteja nos enganado em relação ao resultado fina que você deseja. Para mostrar que minha query funciona, seja com os dados informados seja modificando um dos CPFs (modifiquei o CPF do contrato yui para 567), a query finciona com qq uma das alternativas.

     

    Segue o script:

    Code Snippet

    /*

    CREATE TABLE #AnaliseContratos (CPF INT, Contratos Varchar (5), DiasAtraso   int)

     

    insert into #AnaliseContratos values (123, 'xyz', 100)

    insert into #AnaliseContratos values (123, 'qwe', 110)

    insert into #AnaliseContratos values (123, 'asd', 120)

    insert into #AnaliseContratos values (345, 'ghj', 200)

    insert into #AnaliseContratos values (567, 'yui', 210)

    insert into #AnaliseContratos values (234, 'wer', 311)

     

    -- Result Esperado

    QTD_CPF          QTD_Contratos                FAIXAS_DE_ATRASO

    ------------------------------------------------------------------------------

    1                        3                                Menor que 200 dias

    2                        2                                Entre 200 e 300 dias

    1                        1                                Maior que 300 dias

    */

     

    SELECT A.FAIXAS_DE_ATRASO, COUNT (*) AS QTD_Contratos, G_QTD_CPF.CPF

    FROM (

          SELECT DISTINCT

                CASE

                      WHEN DIASATRASO < 200 THEN 'Menor que 200 dias'

                      WHEN DIASATRASO BETWEEN 200 AND 300 THEN 'Entre 200 e 300 dias'

                      WHEN DIASATRASO > 300 THEN 'Maior que 300 dias'

                END AS FAIXAS_DE_ATRASO

          FROM #AnaliseContratos A) A

     

    INNER JOIN (

                SELECT

                      CASE

                            WHEN DIASATRASO < 200 THEN 'Menor que 200 dias'

                            WHEN DIASATRASO BETWEEN 200 AND 300 THEN 'Entre 200 e 300 dias'

                            WHEN DIASATRASO > 300 THEN 'Maior que 300 dias'

                      END AS FAIXAS_DE_ATRASO

                      , CPF , COUNT (*) as cpf_COUNT

                FROM #AnaliseContratos

                GROUP BY DIASATRASO, CPF) AS G_QTD_Contratos

                      ON G_QTD_Contratos.FAIXAS_DE_ATRASO = A.FAIXAS_DE_ATRASO

     

    INNER JOIN (

                SELECT C.FAIXAS_DE_ATRASO, SUM (COUNT_CPF) CPF

                FROM (

                      SELECT DISTINCT

                            CASE

                                 WHEN DIASATRASO < 200 THEN 'Menor que 200 dias'

                                 WHEN DIASATRASO BETWEEN 200 AND 300 THEN 'Entre 200 e 300 dias'

                                 WHEN DIASATRASO > 300 THEN 'Maior que 300 dias'

                            END AS FAIXAS_DE_ATRASO

                            ,cpf, COUNT (*) AS COUNT_CPF

                      FROM #AnaliseContratos

                      GROUP BY DIASATRASO, cpf, DIASATRASO

                      ) C

                GROUP BY C.FAIXAS_DE_ATRASO

                ) AS G_QTD_CPF

                      ON G_QTD_CPF.FAIXAS_DE_ATRASO = A.FAIXAS_DE_ATRASO

    GROUP BY A.FAIXAS_DE_ATRASO, G_QTD_CPF.CPF

     

     

    Será que eu alcencei o que você desejava?

    quinta-feira, 10 de abril de 2008 20:24
  • TAVA ATRAS JUSTAMENTE DESSA QUERY AMIGO. NÃO ESTAVA CONSEGUINDO QUEBRA O ESTOQUE DA CARTEIRA SANTANDER.

    OBRIGADO!! ESPERO QUE VOCÊ JA TENHA CONSEGUINDO O QUE PROCURAVA.

    sexta-feira, 20 de julho de 2012 13:40
  • Ola, estou iniciando na área, vou aproveitar e estudar esta query aí ... ia tentar ajudar estava pensando em CTE's mas não sei se iria conseguir e talvez poderia ficar mais complicado ... de qualquer maneira vou tentar se conseguir eu posto ...

    abç,.

    sábado, 28 de julho de 2012 05:54
  • Reinaildo e Caio,

    Por gentileza vamos abrir um novo posts com esta dúvida, pois este trata-se de um post antigo e por regra não devemos mais utilizar o mesmo.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    segunda-feira, 30 de julho de 2012 12:45
  •  é vdd ... agora que reparei que este post tem mais de 4 anos.
    segunda-feira, 30 de julho de 2012 19:00