none
SQL SERVER - Consulta Data RRS feed

  • Pergunta

  • Amigos, boa tarde

    Gostaria de pedir outra ajuda, tenho a tabela abaixo em meu banco de dados:

    

    Gostaria de trazer os dados abaixo:

    Lista todos os títulos do Cedente que foram adquiridos contendo títulos vencidos (data mais antigo).

    Imagem abaixo o Cedente Arya Stark possui 5 títulos, no dia 01/01/2019 adquiriu 3 títulos novos, porem o cliente possuía 2 títulos vencidos (31/12/2017 e 31/12/2018), o mais antigo tem a data de 31/12/2017.

    Data_Aquisicao >= min(Data_Vencimento)


    Criando a tabela

    CREATE TABLE Dados.Estoque
    (
    ID INT NOT NULL IDENTITY (1,1),
    Cedente VARCHAR(50),
    Documento VARCHAR(50),
    Data_Posicao DATE,
    Data_Aquisicao DATE,
    Data_Vencimento DATE,
    Valor_Compra DECIMAL(20,2),
    Valor_Presente DECIMAL(20,2),
    Valor_Nominal DECIMAL(20,2),
    Status VARCHAR(50)
    )

    Inserindo os dados

    INSERT INTO Dados.Estoque VALUES ('Arya Stark', '2019A', '20191030', '20190101', '20191001', '8589.00', '10500.00', '10500.00', 'Vencido')
    INSERT INTO Dados.Estoque VALUES ('Arya Stark', '2019B', '20191030', '20190101', '20191101', '8372.00', '8386.00', '10500.00', 'A Vencer')
    INSERT INTO Dados.Estoque VALUES ('Arya Stark', '2019C', '20191030', '20190101', '20191201', '8162.00', '8386.00', '10500.00', 'A Vencer')
    INSERT INTO Dados.Estoque VALUES ('Arya Stark', '2018', '20191030', '20180101', '20181231', '7952.00', '10500.00', '10500.00', 'Venciado')
    INSERT INTO Dados.Estoque VALUES ('Arya Stark', '2017', '20191030', '20170101', '20171231', '7952.00', '10500.00', '10500.00', 'Venciado')
    INSERT INTO Dados.Estoque VALUES ('Brandon Stark', '0001-5', '20191030', '20181215', '20190115', '4994.60', '5100.00', '5100.00', 'Venciado')
    INSERT INTO Dados.Estoque VALUES ('Brandon Stark', '0002-5', '20191030', '20181220', '20190215', '5002.40', '5200.00', '5200.00', 'Venciado')
    INSERT INTO Dados.Estoque VALUES ('Brandon Stark', '0003-5', '20191030', '20181225', '20190315', '5017.33', '5300.00', '5300.00', 'Venciado')
    INSERT INTO Dados.Estoque VALUES ('Brandon Stark', '0004-5', '20191030', '20181230', '20190415', '5018.40', '5400.00', '5400.00', 'Venciado')
    INSERT INTO Dados.Estoque VALUES ('Brandon Stark', '0005-5', '20191030', '20190120', '20190515', '4616.67', '5000.00', '5000.00', 'Venciado')
    INSERT INTO Dados.Estoque VALUES ('Daenerys Targaryen', 'A1', '20191030', '20180701', '20190101', '43866.67', '50000.00', '50000.00', 'Venciado')
    INSERT INTO Dados.Estoque VALUES ('Daenerys Targaryen', 'B2', '20191030', '20190101', '20190701', '43966.67', '50000.00', '50000.00', 'Venciado')
    INSERT INTO Dados.Estoque VALUES ('Daenerys Targaryen', 'C3', '20191030', '20190701', '20200101', '43866.67', '45966.67', '50000.00', 'A Vencer')
    INSERT INTO Dados.Estoque VALUES ('Daenerys Targaryen', 'D4', '20191030', '20190701', '20200701', '37800.00', '45966.67', '50000.00', 'A Vencer')



    • Editado Mesquita, Ecm quarta-feira, 30 de outubro de 2019 19:31
    quarta-feira, 30 de outubro de 2019 19:29

Todas as Respostas

  • Boa tarde,

    Não entendi muito bem... no seu exemplo, o título com vencimento em 31/12/2018 não deveria constar no resultado?

    Ele foi adquirido em 01/01/2018, isto é, depois de 31/12/2017 que é o menor vencimento.


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 30 de outubro de 2019 19:51
  • Boa tarde

    Pegando os dados acima, o cedente Arya Stark possui os títulos listados abaixo Tabela 1, na coluna Data_Aquisicao tem 3 títulos que foram adquiridos em 01/01/2019 porem ele ainda tinha 2 títulos vencidos conforme demostrado a coluna Data_Vencimento, o titulo vencido mais antigo e do dia 31/12/2017, então a consulta deve trazer os 3 títulos que foram adquiridos apos o titulo vencido mais antigo, conforme a Tabela 2 abaixo.

    Tabela 1

    Tabela 2



    • Editado Mesquita, Ecm quarta-feira, 30 de outubro de 2019 20:03
    quarta-feira, 30 de outubro de 2019 19:58
  • Deleted
    quarta-feira, 30 de outubro de 2019 20:08
  • Boa tarde José Diniz,

    Referente a duvida do zeramento do ID, manteremos a informação original e incluímos uma coluna no final sempre efetuando a inicialização da sequencia.

    A duvida acima seria somente uma consulta, usamos o SQL Server 2017.

    A consulta foi pedido de um gerente que pediu algo que nosso sistema nao gera a informação.


    • Editado Mesquita, Ecm quarta-feira, 30 de outubro de 2019 20:17
    quarta-feira, 30 de outubro de 2019 20:14
  • Ainda não entendi... pelo que entendo esse título com vencimento em 31/12/2018 foi adquirido (01/01/2018) após o título vencido mais antigo (31/12/2017).

    Acho que esse título com vencimento em 31/12/2018 pode ser considerado vencido se considerarmos como referência a data de aquisição dos títulos mais recentes que no caso é 01/01/2019, mas nesse caso o critério seria diferente.


    Assinatura: http://www.imoveisemexposicao.com.br



    • Editado gapimex quarta-feira, 30 de outubro de 2019 20:39
    quarta-feira, 30 de outubro de 2019 20:37
  • Deleted
    quarta-feira, 30 de outubro de 2019 20:42
  • Mesquita,

    O cliente pode adquirir um outro título mesmo tendo algum em aberto, atrasado ou já vencido e não quitado?


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 31 de outubro de 2019 00:20
  • Boa tarde José Diniz,

    Referente a duvida do zeramento do ID, manteremos a informação original e incluímos uma coluna no final sempre efetuando a inicialização da sequencia.

    Mesquita,

    Neste caso, verifique qual das resposta lhe ajudou e por gentileza marque-a.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 31 de outubro de 2019 00:22
  • Bom dia amigo

    Caso o o cedente tenha algum titulo vencido, o cliente nao poderia efetuar nenhuma operação nova, a limitação deve ser a data do titulo vencido mais antigo.

    Como o sistema nao amarra essa informação, a ideia agora sera listar todos os títulos que foram operados apos o titulo vencido mais antigo e cobrar os gerentes a recompra.

    quinta-feira, 31 de outubro de 2019 17:53
  • José Diz

    Deu certo a consulta acima, e isso msm, obrigado.

    So ficou faltando a coluna que mostrasse qual seria a data do vencido mais antigo do Cedente.

    Tentei colocar uma coluna usando o MIN( mais da erro, incluir somente a coluna em vermelho na consulta acima!

    quinta-feira, 31 de outubro de 2019 18:29
  • Deleted
    quinta-feira, 31 de outubro de 2019 18:42
  • Deleted
    quinta-feira, 31 de outubro de 2019 19:00
  • Boa noite,

    Mesquita, segue uma sugestão para testes:

    with CTE_Min as
    (
        select 
            *,
            min(case when Status = 'Vencido' then Data_Vencimento end) 
                over(partition by Cedente) Data_Vencimento_Min
        from Dados.Estoque
    )
    
    select * from CTE_Min
    where Data_Aquisicao >= Data_Vencimento_Min

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 1 de novembro de 2019 00:00
  • Mesquita,

    Veja se esta abordagem te ajuda:

    Select * From (Select *, Min(Case When Status = 'Vencido' Then Data_Vencimento
    End) Over(Partition by Cedente) As MinDataVencimento
    from Dados.Estoque) As Minimo
    Where Data_Aquisicao >= MinDataVencimentoMin


    Não testei, poderá conter erros.

    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 1 de novembro de 2019 01:16
  • Junior,

    Obrigado pela atenção, mais nao deu certo não aparece nenhuma informação.

    Daria também para inserir uma as colunas de dias uteis no final?! consigo colocar dias corridos usando o DATEDIFF(DAY, Data_Aquisicao, Data_Posicao).

    Outros locais que mostra as datas uteis acabei me perdendo no caminho... rsrs

    Ficaria + ou - assim

    sexta-feira, 8 de novembro de 2019 20:46
  • Deleted
    sexta-feira, 8 de novembro de 2019 21:38
  • Mesquita,

    O exemplo abaixo ilustra como podemos criar um calendário annual de feriados, o mesmo não é de minha autoria, já utilizei em outros cenários e tive um ótimo retorno:

    CREATE SCHEMA Auxiliary
    -- We put our auxiliary tables and stuff in a separate schema
    -- One of the great new things in SQL Server 2005
    go
    
    CREATE FUNCTION Auxiliary.Computus
    -- Computus (Latin for computation) is the calculation of the date of
    -- Easter in the Christian calendar
    -- http://en.wikipedia.org/wiki/Computus
    -- I'm using the Meeus/Jones/Butcher Gregorian algorithm
    (
        @Y INT -- The year we are calculating easter sunday for
    )
    RETURNS DATETIME
    AS
    BEGIN
    DECLARE
    @a INT,
    @b INT,
    @c INT,
    @d INT,
    @e INT,
    @f INT,
    @g INT,
    @h INT,
    @i INT,
    @k INT,
    @L INT,
    @m INT
    
    SET @a = @Y % 19
    SET @b = @Y / 100
    SET @c = @Y % 100
    SET @d = @b / 4
    SET @e = @b % 4
    SET @f = (@b + 8) / 25
    SET @g = (@b - @f + 1) / 3
    SET @h = (19 * @a + @b - @d - @g + 15) % 30
    SET @i = @c / 4
    SET @k = @c % 4
    SET @L = (32 + 2 * @e + 2 * @i - @h - @k) % 7
    SET @m = (@a + 11 * @h + 22 * @L) / 451
    RETURN(DATEADD(month, ((@h + @L - 7 * @m + 114) / 31)-1, cast(cast(@Y AS VARCHAR) AS Datetime)) + ((@h + @L - 7 * @m + 114) % 31))
    END
    GO
    
    
    CREATE TABLE [Auxiliary].[Calendar] (
    -- This is the calendar table
      [Date] datetime NOT NULL,
      [Year] int NOT NULL,
      [Quarter] int NOT NULL,
      [Month] int NOT NULL,
      [Week] int NOT NULL,
      [Day] int NOT NULL,
      [DayOfYear] int NOT NULL,
      [Weekday] int NOT NULL,
      [Fiscal_Year] int NOT NULL,
      [Fiscal_Quarter] int NOT NULL,
      [Fiscal_Month] int NOT NULL,
      [KindOfDay] varchar(10) NOT NULL,
      [Description] varchar(50) NULL,
      PRIMARY KEY CLUSTERED ([Date])
    )
    GO
    
    ALTER TABLE [Auxiliary].[Calendar]
    -- In Celkoish style I'm manic about constraints (Never use em ;-))
    -- http://www.celko.com/
    
    ADD CONSTRAINT [Calendar_ck] CHECK (  ([Year] > 1900)
    AND ([Quarter] BETWEEN 1 AND 4)
    AND ([Month] BETWEEN 1 AND 12)
    AND ([Week]  BETWEEN 1 AND 53)
    AND ([Day] BETWEEN 1 AND 31)
    AND ([DayOfYear] BETWEEN 1 AND 366)
    AND ([Weekday] BETWEEN 1 AND 7)
    AND ([Fiscal_Year] > 1900)
    AND ([Fiscal_Quarter] BETWEEN 1 AND 4)
    AND ([Fiscal_Month] BETWEEN 1 AND 12)
    AND ([KindOfDay] IN ('HOLIDAY', 'SATURDAY', 'SUNDAY', 'BANKDAY')))
    GO
    
    
    
    
    SET DATEFIRST 1;
    -- I want my table to contain datedata acording to ISO 8601
    -- http://en.wikipedia.org/wiki/ISO_8601
    -- thus first day of a week is monday
    WITH Dates(Date)
    -- A recursive CTE that produce all dates between 1999 and 2020-12-31
    AS
    (
    SELECT cast('1999' AS DateTime) Date -- SQL Server supports the ISO 8601 format so this is an unambigious shortcut for 1999-01-01
    UNION ALL                            -- http://msdn2.microsoft.com/en-us/library/ms190977.aspx
    SELECT (Date + 1) AS Date
    FROM Dates
    WHERE
    Date < cast('2021' AS DateTime) -1
    ),
    
    DatesAndThursdayInWeek(Date, Thursday)
    -- The weeks can be found by counting the thursdays in a year so we find
    -- the thursday in the week for a particular date
    AS
    (
    SELECT
    Date,
    CASE DATEPART(weekday,Date)
    WHEN 1 THEN Date + 3
    WHEN 2 THEN Date + 2
    WHEN 3 THEN Date + 1
    WHEN 4 THEN Date
    WHEN 5 THEN Date - 1
    WHEN 6 THEN Date - 2
    WHEN 7 THEN Date - 3
    END AS Thursday
    FROM Dates
    ),
    
    Weeks(Week, Thursday)
    -- Now we produce the weeknumers for the thursdays
    -- ROW_NUMBER is new to SQL Server 2005
    AS
    (
    SELECT ROW_NUMBER() OVER(partition by year(Date) order by Date) Week, Thursday
    FROM DatesAndThursdayInWeek
    WHERE DATEPART(weekday,Date) = 4
    )
    INSERT INTO Auxiliary.Calendar
    SELECT
    d.Date,
    YEAR(d.Date) AS Year,
    DATEPART(Quarter, d.Date) AS Quarter,
    MONTH(d.Date) AS Month,
    w.Week,
    DAY(d.Date) AS Day,
    DATEPART(DayOfYear, d.Date) AS DayOfYear,
    DATEPART(Weekday, d.Date) AS Weekday,
    
    -- Fiscal year may be different to the actual year in Norway the are the same
    -- http://en.wikipedia.org/wiki/Fiscal_year
    YEAR(d.Date) AS Fiscal_Year,
    DATEPART(Quarter, d.Date) AS Fiscal_Quarter,
    MONTH(d.Date) AS Fiscal_Month,
    
    CASE
    -- Holidays in Norway
    -- For other countries and states: Wikipedia - List of holidays by country
    -- http://en.wikipedia.org/wiki/List_of_holidays_by_country
        WHEN (DATEPART(DayOfYear, d.Date) = 1)          -- New Year's Day
        OR (d.Date = Auxiliary.Computus(YEAR(Date))-7)  -- Palm Sunday
        OR (d.Date = Auxiliary.Computus(YEAR(Date))-3)  -- Maundy Thursday
        OR (d.Date = Auxiliary.Computus(YEAR(Date))-2)  -- Good Friday
        OR (d.Date = Auxiliary.Computus(YEAR(Date)))    -- Easter Sunday
        OR (d.Date = Auxiliary.Computus(YEAR(Date))+39) -- Ascension Day
        OR (d.Date = Auxiliary.Computus(YEAR(Date))+49) -- Pentecost
        OR (d.Date = Auxiliary.Computus(YEAR(Date))+50) -- Whitmonday
        OR (MONTH(d.Date) = 5 AND DAY(d.Date) = 1)      -- Labour day
        OR (MONTH(d.Date) = 5 AND DAY(d.Date) = 17)     -- Constitution day
        OR (MONTH(d.Date) = 12 AND DAY(d.Date) = 25)    -- Cristmas day
        OR (MONTH(d.Date) = 12 AND DAY(d.Date) = 26)    -- Boxing day
        THEN 'HOLIDAY'
        WHEN DATEPART(Weekday, d.Date) = 6 THEN 'SATURDAY'
        WHEN DATEPART(Weekday, d.Date) = 7 THEN 'SUNDAY'
        ELSE 'BANKDAY'
    END KindOfDay,
    CASE
    -- Description of holidays in Norway
        WHEN (DATEPART(DayOfYear, d.Date) = 1)            THEN 'New Year''s Day'
        WHEN (d.Date = Auxiliary.Computus(YEAR(Date))-7)  THEN 'Palm Sunday'
        WHEN (d.Date = Auxiliary.Computus(YEAR(Date))-3)  THEN 'Maundy Thursday'
        WHEN (d.Date = Auxiliary.Computus(YEAR(Date))-2)  THEN 'Good Friday'
        WHEN (d.Date = Auxiliary.Computus(YEAR(Date)))    THEN 'Easter Sunday'
        WHEN (d.Date = Auxiliary.Computus(YEAR(Date))+39) THEN 'Ascension Day'
        WHEN (d.Date = Auxiliary.Computus(YEAR(Date))+49) THEN 'Pentecost'
        WHEN (d.Date = Auxiliary.Computus(YEAR(Date))+50) THEN 'Whitmonday'
        WHEN (MONTH(d.Date) = 5 AND DAY(d.Date) = 1)      THEN 'Labour day'
        WHEN (MONTH(d.Date) = 5 AND DAY(d.Date) = 17)     THEN 'Constitution day'
        WHEN (MONTH(d.Date) = 12 AND DAY(d.Date) = 25)    THEN 'Cristmas day'
        WHEN (MONTH(d.Date) = 12 AND DAY(d.Date) = 26)    THEN 'Boxing day'
    END Description
    
    FROM DatesAndThursdayInWeek d
    -- This join is for getting the week into the result set
         inner join Weeks w
         on d.Thursday = w.Thursday
    
    OPTION(MAXRECURSION 0)
    GO
    
    CREATE FUNCTION Auxiliary.Numbers
    (
    @AFrom INT,
    @ATo INT,
    @AIncrement INT
    )
    RETURNS @RetNumbers TABLE
    (
    [Number] int PRIMARY KEY NOT NULL
    )
    AS
    BEGIN
    WITH Numbers(n)
    AS
    (
    SELECT @AFrom AS n
    UNION ALL
    SELECT (n + @AIncrement) AS n
    FROM Numbers
    WHERE
    n < @ATo
    )
    INSERT @RetNumbers
    SELECT n from Numbers
    OPTION(MAXRECURSION 0)
    RETURN;
    END
    GO
    
    CREATE FUNCTION Auxiliary.iNumbers
    (
    @AFrom INT,
    @ATo INT,
    @AIncrement INT
    )
    RETURNS TABLE
    AS
    RETURN(
    WITH Numbers(n)
    AS
    (
    SELECT @AFrom AS n
    UNION ALL
    SELECT (n + @AIncrement) AS n
    FROM Numbers
    WHERE
    n < @ATo
    )
    SELECT n AS Number from Numbers
    )
    GO


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    segunda-feira, 11 de novembro de 2019 19:00