2014-12-13 2 views
0

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

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

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

spGetAccountBalanceByDay(DateTime startDate, DateTime endDate) 

Я хотел бы имя столбца быть отформатирован следующим образом: Р- {0} {1} {2}, где {0} = год , {1} = Месяц и {2} = День.

поэтому на дату 13/12/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 я должен искать в использовании, Я знаю, что он может выбирать столбцы динамически, просто не уверен, как это сделать.

Любые советы будут оценены.

+0

Which ** RDBMS ** вы используете? –

+0

SQL Server 2012 R2. сделав еще несколько исследований, теперь похоже, что Pivot может быть ответом, но я его не использовал – WraithNath

+0

добавить пример данных и желаемый результат. Pivot - это то, что вам нужно –

ответ

2

Комбинируя несколько вещей, я нашел через Интернет это решение, которое я придумал:

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) 
Смежные вопросы