SQL Server 2008 使用 Pivot 获取季度数据

SQL Server 2008 Getting a Quarterly data with Pivot

我正在尝试获取每个交易的所有 NetAmountSUM,我尝试使用 Pivot 来显示 SUM 季度 日期范围内交易的总和。

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

这是我的表格的内容。

这是输出:

正如其他人指出的那样,季度标识符应为 Q1Q2Q3Q4。此外,您必须使用 DATEPART(QUARTER, si.TransactionDate):

而不是按 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

或者,您可以删除 FROM 子句中的 SUMGROUP BY,让 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