Массив как функция для заявления - PullRequest
1 голос
/ 11 июля 2019

У меня есть заявление, которое возвращает одно число для даты.То, что я хочу сделать, - это иметь возможность выполнять оператор в диапазоне дат и получать значение для каждой даты.

select dbo.GetItemMTDIssues(inmastx.fac, inmastx.fpartno, inmastx.frev, '6-01-2019') 
as MTDiss from inmastx where fpartno='ANF-10-6313-102'

Вот так выглядят результаты для одной получаемой даты.с моим текущим заявлением. 6-01-2019

|MTDiss|   
  600

Это ожидаемые результаты, которые мне нужны в диапазоне дат, таких как 6-01-2019 - 6-05-2019

|MTDiss|   
  600   
  450   
  375   
  700   
  300

Также включает функцию, если она полезна.

CREATE FUNCTION [dbo].[GetItemMTDIssues]
    (@fac char(20), @partno char(25), @rev char(3), @currentdate datetime)
    returns numeric (15,5)
    as

    begin
        declare @returnval as numeric (15,5)

        set @returnval =
        isnull(
        (select sum(fQty) 
                from intran 
                where ftype = 'I'
                and month(fdate) = month(@currentdate)
                and year(fdate) = year(@currentdate)
                and fac = @fac
                and fpartno = @partno
                and fcpartrev = @rev)
        ,0.0) * -1

        return @returnval
    end

1 Ответ

2 голосов
/ 12 июля 2019

Сначала вам нужно будет создать диапазон, и приведенный ниже t-sql сделает это.

declare @startDate datetime='6-01-2019'
declare @endDate datetime='6-05-2019'

;with DateRange as (
select @startDate [date]
union all
select DATEADD(day,1,[date]) [date] from DateRange where [date]<@endDate
)
select * from DateRange

мы можем проверить это и увидеть результат, чтобы подтвердить, что это тот диапазон, который мы хотим. примечание: если вам нужно переходить на месяц или количество дней, которые идут каждый день, вам нужно всего лишь изменить код в DATEADD.

Теперь нам нужно обновить вашу функцию, чтобы она брала начало и конец диапазона и позволяла ему использовать все даты диапазона, я думаю, что-то вроде приведенного ниже поможет: -

CREATE FUNCTION [GetItemMTDIssuesRange]
(   
@fac char(20), @partno char(25), @rev char(3), @startDateRange datetime, @EndDateRange datetime
)
RETURNS TABLE 
AS
RETURN 
(
    with DateRange as (
    select @startDateRange [date]
    union all
    select DATEADD(day,1,[date]) [date] from DateRange where [date]<@EndDateRange
    )
    --select * from DateRange
    select (isnull(sum(fQty),0.0) * -1) MTDiss
                    from intran 
                    inner join DateRange on year(fdate) = year(DateRange.[date]) and month(fdate) = month(DateRange.[date]) 
                    where ftype = 'I'
                    and fac = @fac
                    and fpartno = @partno
                    and fcpartrev = @rev
                    group by DateRange.[date]
)
GO

Пожалуйста, проверьте это.

, если вы не хотите менять функцию, это может помочь ниже: -

declare @startDate datetime='6-01-2019'
declare @endDate datetime='6-05-2019'

;with DateRange as (
select @startDate [date]
union all
select DATEADD(day,1,[date]) [date] from DateRange where [date]<@endDate
)
select dbo.GetItemMTDIssues(inmastx.fac, inmastx.fpartno, inmastx.frev, DateRange.[date]) 
as MTDiss from inmastx,DateRange
 where fpartno='ANF-10-6313-102'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...