【问题标题】:Converting Rows into Columns with Custom "as" statement使用自定义“as”语句将行转换为列
【发布时间】:2019-06-24 19:43:35
【问题描述】:

我有以下查询将行转换为列。我需要在列名的末尾用 _name 标记列。

以下查询的以下部分:

as QUOTENAME(FieldName) + '_name'

给出以下错误:

Msg 102, Level 15, State 1, Line 4
Incorrect syntax near '('.

查询:

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

select @cols = STUFF((SELECT ',' + QUOTENAME(FieldName) as QUOTENAME(FieldName) + '_name'
                    from [LookUp].[CustomField]
                    where FieldTable = 'Clientbackground'
                    group by FieldName, CustomFieldID
                    order by CustomFieldID
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = N'SELECT ' + @cols + N' from 
             (
                select isRequired, FieldName
                from [LookUp].[CustomField]
                where FieldTable = ''Clientbackground''
            ) x
            pivot 
            (
                max(isRequired)
                for FieldName in (' + @cols + N')
            ) p '

exec sp_executesql @query;

有谁知道我该如何纠正这个问题?

CREATE TABLE [LookUp].[CustomField](
    [CustomFieldID] [smallint] IDENTITY(1,1) NOT NULL,
    [FieldTable] [nvarchar](100) NOT NULL,
    [FieldName] [nvarchar](100) NOT NULL,
    [Label] [nvarchar](500) NOT NULL,
    [Description] [nvarchar](500) NOT NULL,
    [IsVisible] [int] NOT NULL,
    [IsRequired] [int] NOT NULL,
    [IsAutoAlert] [int] NOT NULL,
 CONSTRAINT [PK_CustomField] PRIMARY KEY CLUSTERED 
(
    [CustomFieldID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)

INSERT [LookUp].[CustomField] ([CustomFieldID], [FieldTable], [FieldName], [Label], [Description], [IsVisible], [IsRequired], [IsAutoAlert]) VALUES (148, N'ClientBackGround', N'FieldName1', N'update label', N'update description', 1, 0, 0)
GO
INSERT [LookUp].[CustomField] ([CustomFieldID], [FieldTable], [FieldName], [Label], [Description], [IsVisible], [IsRequired], [IsAutoAlert]) VALUES (149, N'ClientBackGround', N'FieldName2', N'update label', N'update description', 1, 0, 0)
GO
INSERT [LookUp].[CustomField] ([CustomFieldID], [FieldTable], [FieldName], [Label], [Description], [IsVisible], [IsRequired], [IsAutoAlert]) VALUES (150, N'ClientBackGround', N'FieldName3', N'update label', N'update description', 1, 0, 0)
GO
INSERT [LookUp].[CustomField] ([CustomFieldID], [FieldTable], [FieldName], [Label], [Description], [IsVisible], [IsRequired], [IsAutoAlert]) VALUES (151, N'ClientBackGround', N'FieldName4', N'update label', N'update description', 1, 0, 0)
GO
INSERT [LookUp].[CustomField] ([CustomFieldID], [FieldTable], [FieldName], [Label], [Description], [IsVisible], [IsRequired], [IsAutoAlert]) VALUES (152, N'ClientBackGround', N'FieldName5', N'update label', N'update description', 1, 0, 0)
GO
INSERT [LookUp].[CustomField] ([CustomFieldID], [FieldTable], [FieldName], [Label], [Description], [IsVisible], [IsRequired], [IsAutoAlert]) VALUES (153, N'ClientBackGround', N'FieldName6', N'update label', N'update description', 1, 0, 0)

【问题讨论】:

    标签: sql sql-server tsql pivot dynamic-sql


    【解决方案1】:

    别名不能是表达式,它必须是显式值。您必须将枢轴值拆分为 2:一个用于枢轴,另一个用于 SELECT 列表。

    DECLARE 
        @colsPivot AS NVARCHAR(MAX),
        @colsSelect AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    select @colsPivot = STUFF((SELECT ',' + QUOTENAME(FieldName)
                        from [LookUp].[CustomField]
                        where FieldTable = 'Clientbackground'
                        group by FieldName, CustomFieldID
                        order by CustomFieldID
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    select @colsSelect = STUFF((SELECT ',' + QUOTENAME(FieldName)  + ' as ' + QUOTENAME(FieldName + '_name')
                        from [LookUp].[CustomField]
                        where FieldTable = 'Clientbackground'
                        group by FieldName, CustomFieldID
                        order by CustomFieldID
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    set @query = N'SELECT ' + @colsSelect + N' from 
                 (
                    select isRequired, FieldName
                    from [LookUp].[CustomField]
                    where FieldTable = ''Clientbackground''
                ) x
                pivot 
                (
                    max(isRequired)
                    for FieldName in (' + @colsPivot + N')
                ) p '
    
    exec sp_executesql @query;
    

    【讨论】:

      【解决方案2】:

      您需要两个用于列的变量 - 一个用于 select 中的列,一个用于 pivot 子句中的列:

      DECLARE @cols_p AS NVARCHAR(MAX),
            @cols_s AS NVARCHAR(MAX),
          @query  AS NVARCHAR(MAX)
      
      select @cols_s = STUFF((SELECT ',' + QUOTENAME(FieldName) +  ' as ' + QUOTENAME(FieldName + '_name')  
                          from [LookUp].[CustomField]
                          where FieldTable = 'Clientbackground'
                          group by FieldName, CustomFieldID
                          order by CustomFieldID
                  FOR XML PATH(''), TYPE
                  ).value('.', 'NVARCHAR(MAX)') 
              ,1,1,'')
      
      select @cols_p = STUFF((SELECT ',' + QUOTENAME(FieldName) 
                          from [LookUp].[CustomField]
                          where FieldTable = 'Clientbackground'
                          group by FieldName, CustomFieldID
                          order by CustomFieldID
                  FOR XML PATH(''), TYPE
                  ).value('.', 'NVARCHAR(MAX)') 
              ,1,1,'')
      
      set @query = N'SELECT ' + @cols_s + N' from 
                   (
                      select isRequired, FieldName
                      from [LookUp].[CustomField]
                      where FieldTable = ''Clientbackground''
                  ) x
                  pivot 
                  (
                      max(isRequired)
                      for FieldName in (' + @cols_p + N')
                  ) p '
      
      exec sp_executesql @query;
      

      【讨论】:

        猜你喜欢
        • 2019-11-04
        • 1970-01-01
        • 2017-05-02
        • 1970-01-01
        • 2022-12-25
        • 1970-01-01
        • 1970-01-01
        • 2010-12-20
        • 2014-04-17
        相关资源
        最近更新 更多