Я создаю динамический сводный запрос, который показывает общий NetAmount в неделю для каждого Клиента в пределах заданного диапазона дат. Проблема в том, что НЕ ДОБАВЛЯЕТ ВСЕ NetAmount в течение недели. Вот данные tblSampleSalesInvoices:SQL Server Dynamic Pivot Query
Вот мой сценарий.
CREATE PROCEDURE uspSalesWeeklySummary
(
@CustomerId INT,
@FromDate DATETIME,
@ToDate DATETIME
)
AS
SET NOCOUNT ON
DECLARE @Query AS VARCHAR(MAX)
DECLARE @DateStart DATETIME = @FromDate
DECLARE @tmp TABLE ([Date] VARCHAR(MAX))
DECLARE @Month VARCHAR(MAX)
DECLARE @Day VARCHAR(MAX)
DECLARE @ColumnHeader VARCHAR(MAX)
DECLARE @Headers VARCHAR(MAX)
WHILE DATEADD(WEEK, DATEDIFF(WEEK, '19050101', @DateStart), '19050101') <= DATEADD(WEEK, DATEDIFF(WEEK, '19050101', @ToDate), '19050101')
BEGIN
SET @month = DATENAME(Month, DATEADD(WEEK, DATEDIFF(WEEK, '19050101', @DateStart), '19050101'))
SET @day = CAST(DATEPART(DD, DATEADD(WEEK, DATEDIFF(WEEK, '19050101', @DateStart), '19050101')) AS VARCHAR(MAX))
SET @ColumnHeader = 'Week ' + CAST(DatePart(WEEK,@DateStart) AS VARCHAR(MAX)) + ' - ' + CAST(Year(DATEADD(WEEK, DATEDIFF(WEEK, '19050101', @DateStart), '19050101')) AS VARCHAR(MAX)) + ' - ' + @month + ' - ' + @day
INSERT INTO @tmp ([Date])
VALUES (@ColumnHeader)
SET @DateStart = DATEADD(DD, 7, @DateStart)
END
SELECT @Headers = ISNULL(@Headers + ',','') + QUOTENAME(t.[Date])
FROM @tmp t
SET @Headers = @Headers + ',[Grand Total]'
SET @Query =
'
DECLARE @CustomerId INT = ' + CAST(@CustomerId AS VARCHAR) + '
DECLARE @FromDate DATETIME = CAST(''' + CAST(@FromDate AS VARCHAR) + ''' AS DATETIME)
DECLARE @ToDate DATETIME = CAST(''' + CAST(@ToDate AS VARCHAR) + ''' AS DATETIME)
DECLARE @Headers VARCHAR(MAX) = ''' + CAST(@Headers AS VARCHAR(MAX)) + '''
SELECT *
FROM
(
SELECT c.CustomerName AS CustomerName,
''Week '' + CAST(DatePart(WEEK,si.TransactionDate) AS VARCHAR(MAX)) + '' - ''
+ CAST(Year(DATEADD(WEEK, DATEDIFF(WEEK, ''19050101'', si.TransactionDate), ''19050101'')) AS VARCHAR(MAX)) + '' - ''
+ CAST(DATENAME(Month, DATEADD(WEEK, DATEDIFF(WEEK, ''19050101'', si.TransactionDate), ''19050101'')) AS VARCHAR(MAX)) + '' - ''
+ CAST(DATEPART(DD, DATEADD(WEEK, DATEDIFF(WEEK, ''19050101'', si.TransactionDate), ''19050101'')) AS VARCHAR(MAX)) AS Header,
SUM(si.NetAmount) AS NetAmount
FROM tblSampleSalesInvoices si
LEFT OUTER JOIN tblSampleCustomers c ON c.Id = si.CustomerId
WHERE (si.TransactionDate BETWEEN @FromDate AND DATEADD(WEEK, DATEDIFF(WEEK, ''19050101'', DATEADD(DD, 7 , @ToDate)), ''19050101''))
AND (si.CustomerId = @CustomerId OR @CustomerId = 0)
GROUP BY c.CustomerName, si.TransactionDate
UNION ALL
SELECT c.CustomerName AS CustomerName,
''Grand Total'' AS Header,
SUM(si.NetAmount) AS NetAmount
FROM tblSampleSalesInvoices si
LEFT OUTER JOIN tblSampleCustomers c ON c.Id = si.CustomerId
WHERE (si.TransactionDate BETWEEN @FromDate AND DATEADD(WEEK, DATEDIFF(WEEK, ''19050101'', DATEADD(DD, 7 , @ToDate)), ''19050101''))
AND (si.CustomerId = @CustomerId OR @CustomerId = 0)
GROUP BY c.CustomerName
) AS BaseData
PIVOT
(
SUM(NetAmount)
FOR Header IN (' + @Headers + ')
) AS Pivoting'
EXEC (@Query)
GO
EXEC uspSalesWeeklySummary 0,'01/01/2016','02/01/2016'
В этом сценарии сумма NetAmount будет 10000 только потому, что со дня 1 января 2016 года до февраля 1,2016 только одна сделка (TR0002) не было сделано. Но когда я помещаю 27,2015 и февраль 12016 в параметры. Он показывает только NetAmount TR0001 вместо 25000, который SUM TR0001 и TR0002.
еще никто не ответил потому что вы не указали входные данные правильно. Также ясно объясните, какой результат вы ищете? – KumarHarsh
29 декабря и 1 января находятся в разные недели .. Заголовок за 29 декабря будет «Неделя 53 - 2015 - Декабрь - 27», а глава на 1 января будет «Неделя 1 - 2015 - Декабрь - 27», чтобы вы могли 't объединить эти значения в одном столбце, если они имеют разные значения недели и, следовательно, разные заголовки – JamieD77