none
Descobrir Sequencia RRS feed

  • Pergunta

  • Amigos,

     

    estou querendo buscar as informações de uma tabela mais estou tendo dificuldade. O que eu desejo é seleciona o cliente que possui 3 faturas inadimplentes(Pra classificar a fatura inadimplente já tenho a regra). Porém essas três faturas deverão seguir a ordem cronologica de cada uma delas, ou seja, o cliente que possui as faturas 01/2008, 02/2008 e 03/2008 deverão ser selecionadas, porém o cliente que possui as faturas 01/2008, 04/2008,05/2008 inadimplentes deverão ser descartados na minha seleção. Ressalto que o campo que sinaliza o ano/mês de referência é o vencimento, sendo assim eu estava utilizando a função Month e Years.

     

    Desde já agradeço.

    terça-feira, 29 de julho de 2008 18:03

Respostas

  • Olá Daniel,

     

    Que bom que você vai fazer hora extra. Embora eu tenha detalhado bastante o meu exemplo, ele pode se mostra um pouco difícil. Abusei de um recurso que ainda é novo pra você (as tais das CTEs).

     

    Code Snippet

    CREATE TABLE Faturas (ID_Voice CHAR(7),

    DT_Vecto SMALLDATETIME, Saldo INT)

     

    INSERT INTO Faturas VALUES ('1111111','20080101',0.00)

    INSERT INTO Faturas VALUES ('1111111','20080205',0.00)

    INSERT INTO Faturas VALUES ('1111111','20080309',0.00)

    INSERT INTO Faturas VALUES ('1111111','20080411',0.00)

    INSERT INTO Faturas VALUES ('1111111','20080501',0.00)

    INSERT INTO Faturas VALUES ('2222222','20080123',0.00)

    INSERT INTO Faturas VALUES ('2222222','20080712',0.00)

    INSERT INTO Faturas VALUES ('2222222','20080919',0.00)

    INSERT INTO Faturas VALUES ('2222222','20081021',0.00)

    INSERT INTO Faturas VALUES ('3333333','20080102',0.00)

    INSERT INTO Faturas VALUES ('3333333','20080204',0.00)

     

    -- Recuperar as três primeiras faturas para cada cliente

    WITH TresFaturas AS (

    SELECT ID_Voice, DT_Vecto,

    ROW_NUMBER() OVER (PARTITION BY ID_Voice ORDER BY DT_Vecto) AS NumFat

    FROM Faturas)

     

    SELECT * FROM TresFaturas WHERE NumFat <= 3

     

    -- Recuperar as três primeiras faturas para cada cliente

    -- Somente os que tem três faturas (o 3 não é retornado, pois tem apenas 2)

    WITH TresFaturas AS (

    SELECT ID_Voice, DT_Vecto,

    ROW_NUMBER() OVER (PARTITION BY ID_Voice ORDER BY DT_Vecto) AS NumFat

    FROM Faturas)

     

    SELECT * FROM TresFaturas WHERE NumFat <= 3 AND

    ID_VOICE IN (SELECT ID_VOICE FROM TresFaturas WHERE NumFat = 3)

     

    -- Recuperar as três primeiras faturas para cada cliente

    -- Somente os que tem três faturas (o 3 não é retornado)

    -- A data está no formato DD/MM/YYYY porém com o dia 1

    WITH TresFaturas AS (

    SELECT ID_Voice, DT_Vecto,

    DATEADD(d,1-DAY(DT_Vecto), DT_Vecto) AS Data,

    ROW_NUMBER() OVER (PARTITION BY ID_Voice ORDER BY DT_Vecto) AS NumFat

    FROM Faturas)

     

    SELECT * FROM TresFaturas WHERE NumFat <= 3 AND

    ID_VOICE IN (SELECT ID_VOICE FROM TresFaturas WHERE NumFat = 3)

     

    -- Recuperar as três primeiras faturas para cada cliente

    -- Somente os que tem três faturas (o 3 não é retornado)

    -- A data está no formato DD/MM/YYYY porém com o dia 1

    -- Tudo está resumido em uma CTE (TresFaturasRes)

    WITH TresFaturas AS (

    SELECT ID_Voice, DT_Vecto,

    DATEADD(d,1-DAY(DT_Vecto), DT_Vecto) AS Data,

    ROW_NUMBER() OVER (PARTITION BY ID_Voice ORDER BY DT_Vecto) AS NumFat

    FROM Faturas),

     

    TresFaturasRes AS (

    SELECT ID_Voice, DT_Vecto, Data, NumFat

    FROM TresFaturas WHERE NumFat <= 3 AND

    ID_VOICE IN (SELECT ID_VOICE FROM TresFaturas WHERE NumFat = 3))

     

    SELECT * FROM TresFaturasRes

     

    -- Recuperar as três primeiras faturas para cada cliente

    -- Somente os que tem três faturas (o 3 não é retornado)

    -- A data está no formato DD/MM/YYYY porém com o dia 1

    -- Será feita uma comparação entre as datas e a coluna NumFat

    -- Se as datas "baterem" então são seqüênciais

    WITH TresFaturas AS (

    SELECT ID_Voice, DT_Vecto,

    DATEADD(d,1-DAY(DT_Vecto), DT_Vecto) AS Data,

    ROW_NUMBER() OVER (PARTITION BY ID_Voice ORDER BY DT_Vecto) AS NumFat

    FROM Faturas),

     

    TresFaturasRes AS (

    SELECT ID_Voice, DT_Vecto, Data, NumFat

    FROM TresFaturas WHERE NumFat <= 3 AND

    ID_VOICE IN (SELECT ID_VOICE FROM TresFaturas WHERE NumFat = 3))

     

    SELECT *, DateADD(m,-NumFat,Data) FROM TresFaturasRes

     

    -- Uma nova CTE será criada

    -- Se houver mais de uma data diferente, não há seqüência

    WITH TresFaturas AS (

    SELECT ID_Voice, DT_Vecto,

    DATEADD(d,1-DAY(DT_Vecto), DT_Vecto) AS Data,

    ROW_NUMBER() OVER (PARTITION BY ID_Voice ORDER BY DT_Vecto) AS NumFat

    FROM Faturas),

     

    TresFaturasRes AS (

    SELECT ID_Voice, DT_Vecto, Data, NumFat,

    DateADD(m,-NumFat,Data) AS DataRef

    FROM TresFaturas WHERE NumFat <= 3 AND

    ID_VOICE IN (SELECT ID_VOICE FROM TresFaturas WHERE NumFat = 3)),

     

    TresFaturasFinal AS (

    SELECT ID_Voice, COUNT(DISTINCT DataRef) AS Total

    FROM TresFaturasRes

    GROUP BY ID_Voice

    HAVING COUNT(DISTINCT DataRef) = 1)

     

    -- Logo apenas Invoice 1 tem as três primeiras faturas seqüenciais

    SELECT * FROM TresFaturasFinal

     

    -- Comente o SELECT de cima e rode o debaixo

    SELECT TOP 3 * FROM TresFaturas

    WHERE ID_Voice IN (

    SELECT ID_Voice FROM TresFaturasFinal)

    ORDER BY DT_Vecto

     

     

    [ ]s,

     

    Gustavo

    quarta-feira, 30 de julho de 2008 20:37

Todas as Respostas

  •  

    pode explicar com exemplos ?

     

    Obrigado.

    terça-feira, 29 de julho de 2008 18:11
  • Esse é um exemplo de cliente que eu deveria selecionar, visto que segue a ordem cronologica

     

    Id_Voice, Dt_Vecto, Saldo

    1111111  1/1/2008   0.00

    1111111  1/2/2008   0.00

    1111111  1/3/2008   0.00

     

     

    Esse é o cliente que eu não devo selecionar, visto que não possui a ordem cronologica de faturamento.

     

     

    Id_Voice, Dt_Vecto, Saldo

    1111111  1/1/2008   0.00

    1111111  1/7/2008   0.00

    1111111  1/9/2008   0.00

    terça-feira, 29 de julho de 2008 18:21
  • Dralves,

     

    Acredito que vc deva utilzar as funcoes Month e Year realmente, e trabalhar com o GetDate() como data de referencia.

    Mas ai vai depender tambem da sua necessidade, como por exemplo, a quantidade de meses que vc deseja pegar a inadimplencia, etc.

     

    [ ]s.

     

    terça-feira, 29 de julho de 2008 18:31
  • Thiago,

     

    Realmente é uma solução interessante, trabalhar com o Year e Month.

     

    terça-feira, 29 de julho de 2008 18:37
  • Não entendi por do GetDate(). Eu preciso somente pegar as 3 faturas inadimplentes(Como já disse essa informação eu já sei como vou trabalhar). Porém eu tenho que selecionar 3 faturas em ordem cronologica.

     

    terça-feira, 29 de julho de 2008 18:38
  • Alguem descobriu como faço para pegar esta segquência?

     

    quarta-feira, 30 de julho de 2008 13:42
  • dralves, com tantos posts ate me esqueci de responder este aqui.

     

    Primeiramente, qual o tipo de dado da coluna dt_vencimento?

    Eh esta coluna que vc utilizara para ver a inadimplencia correto?

     

    [ ]s.

    quarta-feira, 30 de julho de 2008 13:53
  • Thiago,

     

    o meu contexto mudou um pouco.

     

    Eu tenho um campo nessa tabela chamado numero da fatura onde ele demonstra a identificação de cada fatura para um determinado cliente. E pra ficar melhor esse campo é está em ordem ascendente, ou seja, a fatura que gerou em 01/01/2008 leva um numero igual a 25 e a próxima fatura que seria a 01/02/2008 levará o numero igual a 36 pro exemplo.

     

    Porém ainda não sei como faço para selecionar somente as 3 primeiras faturas.

     

    Aguardo retorno.

     

    quarta-feira, 30 de julho de 2008 16:28
  • Thiago,

     

    conseguiu ver alguma coisa?

     

    quarta-feira, 30 de julho de 2008 17:45
  • Entao dralves, esta coluna (dt_vencimento) eh de algum tipo de dados data e hora?

     

    O que eu pensaria em fazer eh realmente utilizar o getdate() como referencia. Ou seja, pegaria, por exemplo, tudo o que for inadimplente de month(getdate()) - 3, entendeu? Nesse caso pegaria pessoas com vencimentos de 3 meses atras.

     

    Mas preciso entender primeiro as rotinas de negocios que vcs tem ai.

    Por exemplo. Estou devendo uma parcela, referente ao mes passado.

    Para saber os atrasados eu poderia usar a data de hj como referencia e tirar 30 dias, assim saberia quem esta devendo parcelas de 1 mes atras.

    Se a coluna usada for de algum tipo data e hora vc poderia usar o datediff para fazer isso, subtraindo 30 dias.

     

     [ ]s.

    quarta-feira, 30 de julho de 2008 17:59
  • Thiago, acho que você não entendeu. O que eu tenho são todas as faturas geradas (e não parcelas) para alguns clientes.

    E desejo identificar quais são as 3 primeiras faturas geradas para cada cliente, ou seja, pela data de vencimento buscar isso, mas não sei como fazer essa consulta, pois eu tenho varias faturas para varios clientes.

     

    Você falou em usar o GetDate(), mais não possuo usa-lo pois tenho alguns clientes que em um unico mês gerou mais de 3 faturas.

     

    aguardo retorno

     

    quarta-feira, 30 de julho de 2008 18:15
  • Olá Daniel,

     

    Vou tentar ajudá-lo (essa Thread já está ficando antiga e grande). 2000 ou 2005 ?

     

    [ ]s,

     

    Gustavo

     

    quarta-feira, 30 de julho de 2008 18:30
  • 2005

     

    quarta-feira, 30 de julho de 2008 18:57
  • E ai meu amigo conseguiu alguma coisa?

     

    quarta-feira, 30 de julho de 2008 19:41
  • Olá Daniel,

     

    Já tenho duas soluções possíveis. Estou refletindo sobre qual é a melhor.

     

    [ ]s,

     

    Gustavo

    quarta-feira, 30 de julho de 2008 19:53
  • Valeu!!! Hoje vou fazer hora exrtra mesmo

     

    quarta-feira, 30 de julho de 2008 20:05
  • Olá Daniel,

     

    Que bom que você vai fazer hora extra. Embora eu tenha detalhado bastante o meu exemplo, ele pode se mostra um pouco difícil. Abusei de um recurso que ainda é novo pra você (as tais das CTEs).

     

    Code Snippet

    CREATE TABLE Faturas (ID_Voice CHAR(7),

    DT_Vecto SMALLDATETIME, Saldo INT)

     

    INSERT INTO Faturas VALUES ('1111111','20080101',0.00)

    INSERT INTO Faturas VALUES ('1111111','20080205',0.00)

    INSERT INTO Faturas VALUES ('1111111','20080309',0.00)

    INSERT INTO Faturas VALUES ('1111111','20080411',0.00)

    INSERT INTO Faturas VALUES ('1111111','20080501',0.00)

    INSERT INTO Faturas VALUES ('2222222','20080123',0.00)

    INSERT INTO Faturas VALUES ('2222222','20080712',0.00)

    INSERT INTO Faturas VALUES ('2222222','20080919',0.00)

    INSERT INTO Faturas VALUES ('2222222','20081021',0.00)

    INSERT INTO Faturas VALUES ('3333333','20080102',0.00)

    INSERT INTO Faturas VALUES ('3333333','20080204',0.00)

     

    -- Recuperar as três primeiras faturas para cada cliente

    WITH TresFaturas AS (

    SELECT ID_Voice, DT_Vecto,

    ROW_NUMBER() OVER (PARTITION BY ID_Voice ORDER BY DT_Vecto) AS NumFat

    FROM Faturas)

     

    SELECT * FROM TresFaturas WHERE NumFat <= 3

     

    -- Recuperar as três primeiras faturas para cada cliente

    -- Somente os que tem três faturas (o 3 não é retornado, pois tem apenas 2)

    WITH TresFaturas AS (

    SELECT ID_Voice, DT_Vecto,

    ROW_NUMBER() OVER (PARTITION BY ID_Voice ORDER BY DT_Vecto) AS NumFat

    FROM Faturas)

     

    SELECT * FROM TresFaturas WHERE NumFat <= 3 AND

    ID_VOICE IN (SELECT ID_VOICE FROM TresFaturas WHERE NumFat = 3)

     

    -- Recuperar as três primeiras faturas para cada cliente

    -- Somente os que tem três faturas (o 3 não é retornado)

    -- A data está no formato DD/MM/YYYY porém com o dia 1

    WITH TresFaturas AS (

    SELECT ID_Voice, DT_Vecto,

    DATEADD(d,1-DAY(DT_Vecto), DT_Vecto) AS Data,

    ROW_NUMBER() OVER (PARTITION BY ID_Voice ORDER BY DT_Vecto) AS NumFat

    FROM Faturas)

     

    SELECT * FROM TresFaturas WHERE NumFat <= 3 AND

    ID_VOICE IN (SELECT ID_VOICE FROM TresFaturas WHERE NumFat = 3)

     

    -- Recuperar as três primeiras faturas para cada cliente

    -- Somente os que tem três faturas (o 3 não é retornado)

    -- A data está no formato DD/MM/YYYY porém com o dia 1

    -- Tudo está resumido em uma CTE (TresFaturasRes)

    WITH TresFaturas AS (

    SELECT ID_Voice, DT_Vecto,

    DATEADD(d,1-DAY(DT_Vecto), DT_Vecto) AS Data,

    ROW_NUMBER() OVER (PARTITION BY ID_Voice ORDER BY DT_Vecto) AS NumFat

    FROM Faturas),

     

    TresFaturasRes AS (

    SELECT ID_Voice, DT_Vecto, Data, NumFat

    FROM TresFaturas WHERE NumFat <= 3 AND

    ID_VOICE IN (SELECT ID_VOICE FROM TresFaturas WHERE NumFat = 3))

     

    SELECT * FROM TresFaturasRes

     

    -- Recuperar as três primeiras faturas para cada cliente

    -- Somente os que tem três faturas (o 3 não é retornado)

    -- A data está no formato DD/MM/YYYY porém com o dia 1

    -- Será feita uma comparação entre as datas e a coluna NumFat

    -- Se as datas "baterem" então são seqüênciais

    WITH TresFaturas AS (

    SELECT ID_Voice, DT_Vecto,

    DATEADD(d,1-DAY(DT_Vecto), DT_Vecto) AS Data,

    ROW_NUMBER() OVER (PARTITION BY ID_Voice ORDER BY DT_Vecto) AS NumFat

    FROM Faturas),

     

    TresFaturasRes AS (

    SELECT ID_Voice, DT_Vecto, Data, NumFat

    FROM TresFaturas WHERE NumFat <= 3 AND

    ID_VOICE IN (SELECT ID_VOICE FROM TresFaturas WHERE NumFat = 3))

     

    SELECT *, DateADD(m,-NumFat,Data) FROM TresFaturasRes

     

    -- Uma nova CTE será criada

    -- Se houver mais de uma data diferente, não há seqüência

    WITH TresFaturas AS (

    SELECT ID_Voice, DT_Vecto,

    DATEADD(d,1-DAY(DT_Vecto), DT_Vecto) AS Data,

    ROW_NUMBER() OVER (PARTITION BY ID_Voice ORDER BY DT_Vecto) AS NumFat

    FROM Faturas),

     

    TresFaturasRes AS (

    SELECT ID_Voice, DT_Vecto, Data, NumFat,

    DateADD(m,-NumFat,Data) AS DataRef

    FROM TresFaturas WHERE NumFat <= 3 AND

    ID_VOICE IN (SELECT ID_VOICE FROM TresFaturas WHERE NumFat = 3)),

     

    TresFaturasFinal AS (

    SELECT ID_Voice, COUNT(DISTINCT DataRef) AS Total

    FROM TresFaturasRes

    GROUP BY ID_Voice

    HAVING COUNT(DISTINCT DataRef) = 1)

     

    -- Logo apenas Invoice 1 tem as três primeiras faturas seqüenciais

    SELECT * FROM TresFaturasFinal

     

    -- Comente o SELECT de cima e rode o debaixo

    SELECT TOP 3 * FROM TresFaturas

    WHERE ID_Voice IN (

    SELECT ID_Voice FROM TresFaturasFinal)

    ORDER BY DT_Vecto

     

     

    [ ]s,

     

    Gustavo

    quarta-feira, 30 de julho de 2008 20:37
  • Daniel, Gustavo,

     

    Não sei se a solução é melhor ou pior (Gustavo, não cheguei a testar o teu código!), mas segue abaixo solução resolvendo tudo num mesmo statement e com um pouco menos de código. É uma outra opção para o Daniel dar uma olhada.

     

    Daniel, apenas uma observação:

    1. Lendo o cenário que você descreveu, estou levando em conta que você quer validar apenas os 3 últimos meses, e não quaisquer 3 meses entre todos os meses de determinado cliente (ex: os meses de janeiro, fevereiro e março de 2001 não foram pagos, mas de lá para cá, todos estão em dia!). Pelo que vi, o Gustavo seguiu a mesma linha.

     

    O CENÁRIO está um pouco longo, pra poder testar direitinho, mas o statement está um pouco menor, lá embaixo!

     

    Code Snippet

    --// CENÁRIO

    CREATE TABLE TEST (

    ID_VOICE INT

    , DT_VECTO SMALLDATETIME

    , SALDO INT

    )

    INSERT INTO TEST VALUES (1, '05/01/2007', 100)

    INSERT INTO TEST VALUES (1, '05/01/2008', 100)

    INSERT INTO TEST VALUES (1, '06/01/2008', 100)

    INSERT INTO TEST VALUES (1, '07/01/2008', 100)

    INSERT INTO TEST VALUES (2, '11/01/2007', 100)

    INSERT INTO TEST VALUES (2, '12/01/2007', 100)

    INSERT INTO TEST VALUES (2, '01/01/2008', 100)

    INSERT INTO TEST VALUES (2, '02/01/2008', 100)

    INSERT INTO TEST VALUES (2, '03/01/2008', 100)

    INSERT INTO TEST VALUES (2, '05/01/2008', 100)

    INSERT INTO TEST VALUES (3, '01/01/2008', 100)

    INSERT INTO TEST VALUES (4, '09/01/2006', 100)

    INSERT INTO TEST VALUES (4, '10/01/2006', 100)

    INSERT INTO TEST VALUES (4, '11/01/2006', 100)

    INSERT INTO TEST VALUES (4, '12/01/2006', 100)

    INSERT INTO TEST VALUES (5, '01/01/2006', 100)

    INSERT INTO TEST VALUES (5, '02/01/2006', 100)

    INSERT INTO TEST VALUES (5, '03/01/2006', 100)

    INSERT INTO TEST VALUES (6, '02/01/2009', 100)

    INSERT INTO TEST VALUES (6, '03/01/2009', 100)

    INSERT INTO TEST VALUES (7, '01/01/2007', 100)

    INSERT INTO TEST VALUES (7, '02/01/2007', 100)

    INSERT INTO TEST VALUES (7, '03/01/2007', 100)

    INSERT INTO TEST VALUES (7, '01/01/2008', 100)

    INSERT INTO TEST VALUES (7, '02/01/2008', 100)

    INSERT INTO TEST VALUES (7, '03/01/2008', 100)

    INSERT INTO TEST VALUES (7, '12/01/2008', 100)

     

     

    --// SOLUÇÃO

    WITH ULTIMAS_TRES_FATURAS (ID, DATA, SALDO, DATA_MAIS_RECENTE) AS (

    --// Pego o registro com a data mais recente, mais os dois meses

    --// anteriores a esta data

    SELECT T1.*, T2.DATA_MAIS_RECENTE

    FROM TEST T1

    INNER JOIN (

    --// data mais recente de cada um dos ID_VOICE

    SELECT ID_VOICE, MAX(DT_VECTO) AS DATA_MAIS_RECENTE

    FROM TEST

    --// WHERE... (aqui, colocar a regra de inadimplência!!)

    GROUP BY ID_VOICE

    ) T2

    ON T1.ID_VOICE = T2.ID_VOICE

    --// No WHERE abaixo, trago todos os registros onde a data for igual à data mais recente

    --// (obtida na query acima), OU igual ao mês anterior ao mês mais recente, OU igual à

    --// dois meses anteriores à data mais recente.

    WHERE T1.DT_VECTO IN (

    T2.DATA_MAIS_RECENTE

    , DATEADD(MONTH, -1, T2.DATA_MAIS_RECENTE)

    , DATEADD(MONTH, -2, T2.DATA_MAIS_RECENTE)

    )

    )

    SELECT ID, DATA, SALDO

    FROM ULTIMAS_TRES_FATURAS

    WHERE ID IN (

    --// Agrupo por ID_VOICE, para pegar apenas registros com 3 meses inadimplentes. Se houver apenas 1 ou 2 meses, não virá no resultado

    SELECT ID

    FROM ULTIMAS_TRES_FATURAS

    GROUP BY ID

    HAVING COUNT(ID) = 3

    )

    ORDER BY ID, DATA

     

    Se achar algum furo ou algum problema, é só avisar. 

     

    Um abraço,

    Raul Santos

     

    quinta-feira, 31 de julho de 2008 22:15
  • Oi Raul, Daniel

     

    Acho que gastar alguns ms a mais em nome de um código mais limpo é justificável. A clareza do código facilita também sua manutenção e olhando a minha consulta e a sua, certamente que a sua é mais clara e mais fácil de manter. Acredito até que ela seja mais rápida, então se ela é de fato mais clara e provavelmente mais rápida, certamente é uma solução mais efetiva.

     

    No entanto estou com uma dúvida sobre o resultado produzido. Sua consulta irá supor que a fatura é cadastrada sempre no mesmo dia e por isso fica fácil aplicar a função DATEADD com o MONTH. Isso funcionaria de uma forma mais clara e acredito mais eficiente que a minha proposta. Só que se o importante for identificar faturas seqüencias em nível de mês, mas cadastradas em dias diferentes, não sei se a sua produzirá o resultado correto.

     

    Ainda assim, sua idéia do DATEADD com o MONTH passando o -1 e -2 é mais eficiente que a minha utilização do ROW_NUMBER e se a sua não atender pela limitação que descrevi, podemos combinar as propostas em uma terceira alternativa.

     

    Daniel,

     

    Se houver um dia fixo para cadastrar a fatura, minha solução poderia ser adaptada, mas se a do Raul já atende, a dele é uma ótima alternativa.

     

    [ ]s,

     

    Gustavo

    quinta-feira, 31 de julho de 2008 23:18
  • Gustavo,


    Tem razão, percebi esta exceção quando escrevi a query, mas esqueci de perguntar isto para o Daniel. Mas no caso de termos dias distintos, acredito que com umas poucas alterações consigamos fazer este tratamento (fiz umas brincadeiras com isto também).

     

    Mas tou contigo, se precisar, mesclamos as soluções e bolamos uma terceira alternativa que atenda todas as exceções.

     

    Um abraço,

    Raul Santos

    quinta-feira, 31 de julho de 2008 23:53
  • Gustavo,

     

    O seu exemplo funcionou corretamente. E é exatamente isso que eu quero.

     

    Mais uma vez muito obrigado.

     

    Mas eu não entendi como é o funcionamento do With. Toda vez que chama o With ( os 4 primeiros ) você faz consulta em cima do 1 With?

     

    Aguardo Retorno

    segunda-feira, 4 de agosto de 2008 12:59
  • Gustavo,

     

    Eu não entendi porque você colocou o sinal de subtração no DateADD(m,-NumFat,Data).

    segunda-feira, 4 de agosto de 2008 14:05
  • Olá Daniel,

     

    A solução do Raul não o atendeu ? Possivelmente ela é mais eficiente.

     

    O funcionamento do WITH é do jeito que você descreveu. O primeiro WITH é definido e usado no segundo e assim sucessivamente até o último WITH. Essa é mais uma vantagem das CTEs para decompor código complexo.

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 4 de agosto de 2008 14:12
  • O código do Raul não serviu. Agora estou com um probleminha. Na minha tabela eu tenho duas ou mais faturas com vencimentos no mesmo mês, ou seja, quando contamos a qtde de faturas e depois substraimos um mês a partir dessa quantidade não traz o resultado esperado.

     

    tem alguma ideia como podemos tratar esses casos com vencimentos para o mesmo mês?

    segunda-feira, 4 de agosto de 2008 14:47
  • Conseguiu ver alguma coisa?

    segunda-feira, 4 de agosto de 2008 20:11