2016-06-22 58 views
0

我想獲得的SUM所有NetAmount的每一項交易的我用透視到日期範圍內顯示該交易的SUM試過季度SQL Server 2008中獲取一季度數據與數據透視

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'分組,而是按整個季度表達式分組 - 再次運行內部選擇來觀察這一點。 –

回答

2

正如其他人所指出的那樣,本季度標識符應該是Q1Q2Q3Q4。此外,而不是由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 

或者,你可以刪除SUMGROUP BYFROM子句中,並讓PIVOT處理聚集。也沒有必要CASTVARCHAR(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對不起,我只注意到第一個和第二個查詢是相同的。請參閱最新的答案。 –