T-SQL透视无法正常工作

时间:2016-02-15 12:10:19

标签: sql sql-server sql-server-2008-r2 pivot

我正在使用SQL Server 2008R2对T-SQL数据库Northwind进行一些培训。

我正在尝试使用下面的查询来转移某些数据,但它会一直返回以下错误:

  

消息156,级别15,状态1,行1关键字附近的语法不正确   “用”。消息170,级别15,状态1,行16行16:语法不正确   靠近'('。

WITH PivotData AS
(
SELECT
        [OrderID],
        [CustomerID], 
        [Freight] 

FROM [Northwind].[dbo].[Orders]
)
SELECT 
    [OrderID], 
    [10248],
    [10249],
    [10250]
FROM PivotData
PIVOT( SUM(Freight) FOR [CustomerID] IN ([10248],[10249],[10250])) AS P

最诚挚的问候,

3 个答案:

答案 0 :(得分:0)

在CTE声明之前必须用分号;完成 前缀CTE,带有相同的分号,例如

;with ctePivotData as
...

答案 1 :(得分:0)

您发布的代码工作正常,听起来您的数据库来自较旧的源并且运行在旧的兼容性级别(因此不支持PIVOT语法)。

运行以下SQL并再试一次:

ALTER DATABASE [Northwind] SET COMPATABILITY_LEVEL 100

有关详细信息,请参阅MSDN。 Theres还有一个帖子here,它将向您展示如何在GUI中执行此操作

答案 2 :(得分:0)

我刚刚在SQL Server 2008 R2实例上运行它没有问题。

SELECT @@VERSION;

结果:

Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) 
    Jun 28 2012 08:36:30 
    Copyright (c) Microsoft Corporation
    Express Edition with Advanced Services (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

脚本:

CREATE TABLE #orders(OrderId INT, CustomerId INT, Freight DECIMAL(28,2));
INSERT INTO #orders(OrderId,CustomerId,Freight)VALUES
    (1,10248,1.22),(1,10249,1.5),(1,10248,.25),(1,10250,.75);
WITH PivotData AS
(
SELECT
        [OrderID],
        [CustomerID], 
        [Freight] 

FROM #Orders
)
SELECT 
    [OrderID], 
    [10248],
    [10249],
    [10250]
FROM PivotData
PIVOT( SUM(Freight) FOR [CustomerID] IN ([10248],[10249],[10250])) AS P;
DROP TABLE #orders;

结果(没有错误):

+---------+-------+-------+-------+
| OrderID | 10248 | 10249 | 10250 |
+---------+-------+-------+-------+
|       1 | 1.47  | 1.50  | 0.75  |
+---------+-------+-------+-------+

PS:我认为WITH之前的语句并不以您的分号结尾,或者您正在使用SSMS 2008 R2在SQL Server 2000实例上运行SQL语句。