【问题标题】:T-SQL Pivoting not workingT-SQL 透视不起作用
【发布时间】:2016-02-15 12:10:19
【问题描述】:

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

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

Msg 156, Level 15, State 1, Line 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

最好的问候,

【问题讨论】:

  • 你的 sql server 版本是多少?
  • 嗨 Madhivanan,版本是 2008R2
  • 您的查询是更大查询的一部分吗?如果可以,你能发布整个代码吗?
  • 不,只是这个,只是测试枢轴功能。
  • 如果你在运行这个查询的数据库上选择SELECT @@VERSION,它会返回什么?

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


【解决方案1】:

CTE 语句之前必须以分号 ; 结尾
前缀 CTE 与相同的分号例如

;with ctePivotData as
...

【讨论】:

  • 您是在 SSMS 窗口中运行此脚本还是从某个应用程序中运行此脚本?
  • 它应该可以工作。除非有其他情况。
  • 嗨伊万检查杰米回答下面我认为他可能有解决方案
  • 不知道为什么这被否决了。尽管在这种情况下这可能不是答案,但它很容易成为问题中错误消息的最常见原因。
【解决方案2】:

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

运行以下 SQL 并重试:

ALTER DATABASE [Northwind] SET COMPATABILITY_LEVEL 100

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

【讨论】:

  • 嗨 Jamie,你说的很有意义,因为查询似乎是正确的,无论如何我无法应用该更改,因为我正在工作数据库中进行培训并且不想弄乱它。
  • 好的,可以备份一下,创建一个开发数据库吗?
  • Jamie 顺便说一句,此更改会影响其他数据库或服务器吗?
  • 我建议您先检查一下您的实际兼容性级别,并找出为什么将其设置为当前值(来自 DBA 或类似他的人)。
  • 是的,我认为更好,我会在晚上回家尝试查询并在此处发布结果,谢谢大家
【解决方案3】:

我刚刚在 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 语句。

【讨论】:

    猜你喜欢
    • 2012-04-09
    • 2015-10-29
    • 2017-02-22
    • 2017-04-09
    • 2011-05-23
    • 1970-01-01
    • 2011-03-22
    • 2012-04-07
    • 1970-01-01
    相关资源
    最近更新 更多