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

SQL Server 2008使用Pivot获取季度数据,sql,sql-server,database,pivot,Sql,Sql Server,Database,Pivot,我正在尝试获取每笔交易的NetAmount的总和,并尝试使用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,

我正在尝试获取每笔交易的NetAmount总和,并尝试使用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
这是我桌子上的内容

以下是输出:


正如其他人所指出的,季度标识符应该是
Q1
Q2
Q3
Q4
。此外,您必须使用
DATEPART(季度,si.TransactionDate)
,而不是按
TransactionDate进行分组:

或者,您可以在
FROM
子句中删除
SUM
groupby
,并让
PIVOT
处理聚合。也无需将
强制转换为
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

正如其他人所指出的,季度标识符应该是
Q1
Q2
Q3
Q4
。此外,您必须使用
DATEPART(季度,si.TransactionDate)
,而不是按
TransactionDate进行分组:

或者,您可以在
FROM
子句中删除
SUM
groupby
,并让
PIVOT
处理聚合。也无需将
强制转换为
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

您的季度身份证不是看起来像
Q1
而不是
1
?自行运行内部选择并进行检查。此外,您可能不应该按
si.TransactionDate
进行分组,而是按完整的季度表达式进行分组-再次运行内部选择以观察这一点。您的季度标识是否看起来像
Q1
而不是
1
?自行运行内部选择并进行检查。此外,您可能不应该按
si.TransactionDate
进行分组,而是按完整的季度表达式进行分组-再次运行内部选择以观察这一点。它起到了作用。因此,在Pivot中,我需要精确地指定列名,而不是在“AS”之后声明的名称,对吗!您需要将从
from
子句中得到的值放入其中。@很抱歉,我刚才注意到第一个查询和第二个查询是相同的。请看最新的答案。谢谢先生。现在只需要做一个动态轴心,它成功了。因此,在Pivot中,我需要精确地指定列名,而不是在“AS”之后声明的名称,对吗!您需要将从
from
子句中得到的值放入其中。@很抱歉,我刚才注意到第一个查询和第二个查询是相同的。请看最新的答案。谢谢先生。现在只需要做这个动态轴心。