SQL Server 2008使用Pivot获取季度数据
我正在尝试获取每笔交易的NetAmount的总和,并尝试使用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,
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
子句中得到的值放入其中。@很抱歉,我刚才注意到第一个查询和第二个查询是相同的。请看最新的答案。谢谢先生。现在只需要做这个动态轴心。