【问题标题】:Struggling with SQL Pivot Query Syntax苦苦挣扎于 SQL Pivot 查询语法
【发布时间】:2015-10-05 08:06:23
【问题描述】:

谁能告诉我我的 SQL 出了什么问题,今天遇到了困难。错误是:

消息 156,级别 15,状态 1,第 11 行

关键字“select”附近的语法不正确。

消息 102,级别 15,状态 1,第 11 行

')' 附近的语法不正确。

SELECT *
FROM (
    SELECT 
        left(datename(month,TransactionDateTime),3) as [month], year(TransactionDateTime) as [year],
        count(*) as Total 
    FROM quotations
) as s
PIVOT
(
    SUM(Total)
    FOR [year] IN (select distinct year(TransactionDateTime) from quotations)
) AS pivot

我追求的形状是......所以列名是年,然后每个月有 12 行。下面只是为了说明形状

        //   var data = google.visualization.arrayToDataTable([
        //  ['Month', '2013', '2014', '2015'],
        //  ['Jan', 10, 30, 31],
        //  ['Feb', 11, 30, 32],
        //]);

【问题讨论】:

  • 查询对我来说似乎没问题,我认为 pivot 是一个保留字,所以最好使用其他别名或至少添加括号:as [pivot]

标签: sql sql-server tsql pivot


【解决方案1】:

pivot 的语法如下(From TechNet):

PIVOT
(
    <aggregation function>(<column being aggregated>)
FOR
[<column that contains the values that will become column headers>]
    IN ( [first pivoted column], [second pivoted column], ... [last pivoted column])
) AS <alias for the pivot table>

您可以看到在IN 子句中应该有列名包含在[] 中,如果列名是动态的,这可能会出现问题。使用动态 SQL 可以轻松解决这个问题。

这是一个例子:

DECLARE @cols AS NVARCHAR(MAX)
DECLARE @query AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(year(TransactionDateTime))
            FROM Quotations
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SET @query = 
    'SELECT *
    FROM (
        SELECT 
            left(datename(month,TransactionDateTime),3) as [month], year(TransactionDateTime) as [year],
            count(*) as Total 
        FROM quotations
    ) as s
    PIVOT
    (
        SUM(Total)
        FOR [year] IN (' + @cols + ')
    ) AS pivot'

EXECUTE(@query)

我不知道您的架构是什么,因此表/列名称可能有误。如果这没有帮助,如果您共享您的架构和示例数据,我会更准确。

【讨论】:

  • 我在您的解决方案中的“FROM Quotations”之后添加了一行“group by left(datename(month,TransactionDateTime),3), year(TransactionDateTime)”,它成功了!谢谢
【解决方案2】:

问题在于查询的以下部分

(select distinct year(TransactionDateTime) from quotations)

您需要在 in 子句中提供一个静态年份列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 2019-01-20
    • 2020-08-06
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多