2016-06-22 4 views
0

Я пытаюсь получить SUM из все NetAmount каждой сделки, и я попытался с помощью Pivot, чтобы показать SUM Сделки в пределах диапазона дат Квартальный.SQL Server 2008 Получение ежеквартальных данных с Pivot

DECLARE @FromDate DATETIME = '01-01-2016' 
DECLARE @ToDate DATETIME = '12-31-2016' 

SELECT CustomerName, 
     ISNULL([1],0) AS Q1, 
     ISNULL([2],0) AS Q2, 
     ISNULL([3],0) AS Q3, 
     ISNULL([4],0) AS Q4 
FROM 
(
    SELECT sc.CustomerName, 
      SUM(si.NetAmount) AS NetAmount, 
      CAST('Q' + CAST(DATEPART(QUARTER, si.TransactionDate)AS VARCHAR(MAX)) AS VARCHAR(MAX)) AS Quarterly 
    FROM tblSampleSalesInvoices si 
     LEFT OUTER JOIN tblSampleCustomers sc ON sc.Id = si.CustomerId 
    WHERE si.TransactionDate BETWEEN @FromDate AND @ToDate 
    GROUP BY sc.CustomerName, si.TransactionDate 
) AS BaseData 
PIVOT 
(
    SUM(NetAmount) 
    FOR Quarterly IN ([1],[2],[3],[4]) 
)AS Pivoting 

Вот содержание моих таблиц.

enter image description here

А вот выход:

enter image description here

+1

Не ваше ежеквартальное identifers выглядеть 'Q1' не' 1'? Запустите внутренний выбор самостоятельно и проверьте. –

+0

Также вам, вероятно, не следует группировать 'si.TransactionDate', но вместо этого группировать по полному выражению четверти - снова запустите внутренний select, чтобы наблюдать это. –

ответ

2

Как уже отмечалось, идентификаторы квартал должны быть Q1, Q2, Q3 и Q4. Кроме того, вместо того, чтобы группировать по TransactionDate, вы должны использовать DATEPART(QUARTER, si.TransactionDate):

SELECT 
    CustomerName, 
    ISNULL([Q1],0) AS Q1, 
    ISNULL([Q2],0) AS Q2, 
    ISNULL([Q3],0) AS Q3, 
    ISNULL([Q4],0) AS Q4 
FROM 
(
    SELECT sc.CustomerName, 
      SUM(si.NetAmount) AS NetAmount, 
      CAST('Q' + CAST(DATEPART(QUARTER, si.TransactionDate)AS VARCHAR(MAX)) AS VARCHAR(MAX)) AS Quarterly 
    FROM tblSampleSalesInvoices si 
     LEFT OUTER JOIN tblSampleCustomers sc ON sc.Id = si.CustomerId 
    WHERE si.TransactionDate BETWEEN @FromDate AND @ToDate 
    GROUP BY sc.CustomerName, DATEPART(QUARTER, si.TransactionDate) 
) AS BaseData 
PIVOT 
(
    SUM(NetAmount) 
    FOR Quarterly IN ([Q1],[Q2],[Q3],[Q4]) 
)AS Pivoting 

В качестве альтернативы, вы можете удалить SUM и GROUP BY в пункте FROM, и пусть PIVOT обрабатывать агрегацию. Также нет необходимости CAST к VARCHAR(MAX), используйте правильную длину:

SELECT 
    CustomerName, 
    ISNULL([Q1],0) AS Q1, 
    ISNULL([Q2],0) AS Q2, 
    ISNULL([Q3],0) AS Q3, 
    ISNULL([Q4],0) AS Q4 
FROM 
(
    SELECT 
     sc.CustomerName, 
     NetAmount AS NetAmount, 
     CAST('Q' + CAST(DATEPART(QUARTER, si.TransactionDate)AS VARCHAR(1)) AS VARCHAR(2)) AS Quarterly 
    FROM #tblSampleSalesInvoices si 
     LEFT OUTER JOIN #tblSampleCustomers sc ON sc.Id = si.CustomerId 
    WHERE si.TransactionDate BETWEEN @FromDate AND @ToDate 
) AS BaseData 
PIVOT 
(
    SUM(NetAmount) 
    FOR Quarterly IN ([Q1],[Q2],[Q3],[Q4]) 
)AS Pivoting 

ONLINE DEMO

+0

Это сработало. Поэтому в Pivot мне нужно точно указать имя столбца вместо имени, объявленного после «AS» – ZeroCool

+0

Право! вам нужно поместить значения, которые вы получаете из предложения 'FROM'. –

+0

@ZeroCool Извините, я только заметил, что первый и второй запросы одинаковы. См. Обновленный ответ. –

Смежные вопросы