在T-SQL中使用Pivot [英] Using Pivot in T-SQL

查看:80
本文介绍了在T-SQL中使用Pivot的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嘿所有,



我正在尝试在SQL Server数据库中的表上执行一个数据透视,但是我遇到了一个无用的错误消息。我的查询如下:



Hey all,

I'm trying to carry out a pivot on a table in a SQL Server Database but am hitting an unhelpful error message. My query is as follows:

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
SELECT @ColumnName= ISNULL(@ColumnName + ', ','') + QUOTENAME(EnquiryPeriod)
FROM (SELECT DISTINCT EnquiryPeriod FROM Enquiries) AS EnqPeriod

SET @DynamicPivotQuery =
  N'SELECT Children.ChildID, ' + @ColumnName + '
    FROM (Enquiries
    INNER JOIN CarerChildren ON CarerChildren.CarerID = Enquiries.CarerID)
    INNER JOIN Children ON CarerChildren.ChildID = Children.ChildID
    WHERE (((CarerChildren.DateMovedOn) Is Null))
    GROUP BY Children.ChildID, [Firstname] + [Surname], Children.DateOfBirth
    ORDER BY [Firstname] + [Surname], Enquiries.EnquiryPeriod
    PIVOT(Max(EnquiryDate)
          FOR EnquiryPeriod IN (' + @ColumnName + ')) AS PVTTable'

EXEC (@DynamicPivotQuery)





它给出错误单词'PIVOT'附近的语法不正确。这可能是一个简单的错误,只是想知道是否有人能发现我做错了什么?



It gives the error "Incorrect syntax near the word 'PIVOT'. It's probably a simple error, just wondering if anyone can spot what I'm doing wrong?

推荐答案

我没有使用数据透视工具,所以它只是一个猜测。不要介意我错了。

我认为你需要遵循以下语法

I havn't worked using pivot so its just a guess. Don't mind if I'm mistaken.
I think you need to follow this syntax as below
SELECT <non-pivoted column>,
    [first pivoted column] AS <column name>,
    [second pivoted column] AS <column name>,
    ...
    [last pivoted column] AS <column name>
FROM
    (<SELECT query that produces the data>)
    AS <alias for the source query>
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>
<optional ORDER BY clause>;





所以我认为你需要在调整之后下订单?



参考:使用PIVOT和UNPIVOT-TechNet-Microsoft [ ^ ]


您需要修改用于源的子查询,以便它具有将用于PIVOT的所有列,像这样:



You need to modify the sub-query that you use for your source so that it has all columns that will be used for your PIVOT, like this:

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
SELECT @ColumnName= ISNULL(@ColumnName + ', ','') + QUOTENAME(EnquiryPeriod)
FROM (SELECT DISTINCT EnquiryPeriod FROM Enquiries) AS EnqPeriod
 
SET @DynamicPivotQuery =
  N'SELECT ChildID, [childName], ' + @ColumnName + '
    FROM (SELECT Children.ChildID, [Firstname] + [Surname] as [childName],
    Enquiries.EnquiryPeriod, EnquiryDate
    FROM Enquiries
    INNER JOIN CarerChildren ON CarerChildren.CarerID = Enquiries.CarerID)
    INNER JOIN Children ON CarerChildren.ChildID = Children.ChildID
    WHERE CarerChildren.DateMovedOn Is Null) AS pvtSource
    PIVOT(Max(EnquiryDate)
          FOR EnquiryPeriod IN (' + @ColumnName + ')) AS PVTTable'
 
EXEC (@DynamicPivotQuery)


两件事:

- > ISNULL(@ColumnName +',','')更好:COALESCE(@ColumnName +',','')

- >是QUOTENAME(EnquiryPeriod)还用逗号分隔?不,但如果明显导致超过1行.....你有问题。

在我的文章 [ ^ ]你看到一个处理该方法的方法
Two things:
-> ISNULL(@ColumnName + ', ','') better: COALESCE(@ColumnName +', ', '')
-> is QUOTENAME(EnquiryPeriod) separating also with a comma? NO but if the distinct results in more than 1 row.....you have a problem.
In my article [^]you see a method to deal with that


这篇关于在T-SQL中使用Pivot的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆