SQL, как выбрать даты между двумя параметрами даты в виде столбцов в хранимой процедуре

Мне нужно написать хранимую процедуру, которая принимает 2 параметра даты, суммирует некоторые данные для этой даты и возвращает строку с датами между ними в виде столбцов.

Я не уверен, с чего начать.

Допустим, моя хранимая процедура выглядит так:

spGetAccountBalanceByDay(DateTime startDate, DateTime endDate)

Я бы хотел, чтобы имя столбца имело следующий формат: F_{0}{1}{2}, где {0} = год, {1} = месяц и {2} = день.

поэтому на дату 12.13.2014 мой столбец будет называться f_2014_12_13. У меня есть источник данных с динамическими свойствами, которые совпадают (поскольку рассматриваемая сетка может быть запущена для любого диапазона дат)

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

Итак, моя таблица будет выглядеть примерно так, возвращаемой хранимой процедурой:

Account Ref | F_2014_12_13 | F_2014_12_14 | F_2014_12_15
------------------------------------------
ABB001        100            150            0

Эти запросы могут возвращать одну или несколько строк, мне просто нужно знать, какую функцию в SQL я должен использовать, я знаю, что можно динамически выбирать столбцы, просто не знаю, как это сделать.

Любой совет будет принят во внимание.


person WraithNath    schedule 13.12.2014    source источник
comment
Какую СУБД вы используете?   -  person Pரதீப்    schedule 13.12.2014
comment
SQL Server 2012 R2. Проведя еще несколько исследований, похоже, что Pivot может быть ответом, но я его не использовал.   -  person WraithNath    schedule 13.12.2014
comment
добавить образцы данных и желаемый результат. Пивот - это то, что вам нужно   -  person Pரதீப்    schedule 13.12.2014
comment
собираюсь попробовать... tavislovell.com/   -  person WraithNath    schedule 13.12.2014
comment
Похоже, вы получили ответ.   -  person Pரதீப்    schedule 13.12.2014


Ответы (1)


Объединив несколько вещей, которые я нашел в Интернете, я придумал решение:

DECLARE @Columns VARCHAR(MAX)
DECLARE @StartDate AS DATETIME
DECLARE @EndDate AS DATETIME
DECLARE @Query AS VARCHAR(MAX)

SET @StartDate = '01 Jan 2012'
SET @EndDate = '31 Mar 2012'

;WITH dateRange as
(
    SELECT [Date] = DATEADD(dd, 1, DATEADD(dd, -1,@startDate))
    WHERE DATEADD(dd, 1, @startDate) < DATEADD(dd, 1, @endDate)
    UNION ALL
    SELECT DATEADD(dd, 1, [Date])
    FROM dateRange
    WHERE DATEADD(dd, 1, [Date]) < DATEADD(dd, 1,@endDate)
)

SELECT @Columns = COALESCE(@Columns, '[') + CONVERT(VARCHAR, [Date], 111) + '],['
FROM dateRange
OPTION (maxrecursion 0)

--delete last two chars of string (the ending ',[') and store columns in variable
SET @Columns = SUBSTRING(@Columns, 1, LEN(@Columns)-2)

SELECT @Columns

SET @Query = 
'
 SELECT *
 FROM 
 (
    SELECT 
                [PLSupplierAccount].[SupplierAccountNumber],
                [PLSupplierAccount].[SupplierAccountName],
                [PLPostedSupplierTran].[DueDate],
                [PLPostedSupplierTran].[GoodsValueInAccountCurrency] * [PLPostedSupplierTran].[DocumentToBaseCurrencyRate] AS [Value]
    FROM        [PLPostedSupplierTran]
    INNER JOIN  [PLSupplierAccount]
    ON          [PLSupplierAccount].[PLSupplierAccountID]
    =           [PLPostedSupplierTran].[PLSupplierAccountID]
    WHERE       [PLPostedSupplierTran].[DueDate]>= ''' + CONVERT(VARCHAR(50), @StartDate, 111) + ''' AND [PLPostedSupplierTran].[DueDate]<= ''' + CONVERT(VARCHAR(50), @EndDate, 111) + '''
 ) src
 PIVOT
 (
    SUM([Value])
    FOR src.[DueDate] IN (' + @Columns + ')
 ) AS PivotView
'

EXEC (@Query)
person WraithNath    schedule 13.12.2014