我需要编写一个存储过程,它接受2个日期参数,汇总该日期的一些数据,并返回一个日期在中间的行作为列。
我不知道从哪里开始。
让我们说我的存储过程如下所示:
spGetAccountBalanceByDay(DateTime startDate, DateTime endDate)
我希望列名的格式如下:F_ {0} {1} {2}其中{0} =年,{1} =月,{2} =一天。
因此,对于2014年12月13日,我的专栏将被称为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 :(得分: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)