【问题标题】:FOR XML in SQL Server causing issue with spaces and :SQL Server 中的 FOR XML 导致空格和:
【发布时间】:2015-01-09 07:03:50
【问题描述】:

我有以下格式的sql表

   deal_key     std_industry_name            balance
   823155199    CORP -: Aerospace & Defense 10169652.43
   823155199    CORP -: Automotive          10155993.82
   823155199    CORP -: Beverage             14779701.43
   823155199    CORP -: Capital Equipment   15150957.89
   823155199    CORP -: Chemicals           14438116.97
   823155199    CORP -: Construction        4901198.24
   823155199    CORP -: Consumer goods       9647987.3

我需要转置表格,因为我要在表格上进行数据透视

通过以下查询,我得到了带有一些错误的 xml 输出,因为行业列在其数据中包含空格和以下字符“:”。

SQL Server 中是否有一种方法可以根据表中的数据对列进行透视,但仍为列名提供别名,或者是否有任何其他方法可以避免此问题

  DECLARE @query VARCHAR(4000)
DECLARE @years VARCHAR(2000)
SELECT  @years = STUFF(( SELECT DISTINCT
                        '],[' + ltrim((std_industry_name))
                        FROM    [cs].[ma_deal_vintage_industry_statistics]
                        FOR XML PATH('')
                        ), 1, 2, '') + ']'

SET @query =
'SELECT * FROM
(
    SELECT deal_key, std_industry_name,balance
    FROM [cs].[ma_deal_vintage_industry_statistics]
    where deal_key =''823155199''
)t
PIVOT (SUM(balance) FOR std_industry_name
IN ('+@years+')) AS pvt for xml auto'

EXECUTE (@query)

【问题讨论】:

    标签: sql-server pivot for-xml


    【解决方案1】:

    旋转后在列标题CORP -: Aerospace & Defense 中看起来像: 是导致for Xml auto 失败的原因。

    替换透视源查询和列列表中的:。试试这个。

       DECLARE @query VARCHAR(4000)
    DECLARE @years VARCHAR(2000)
    SELECT  @years = STUFF(( SELECT DISTINCT
                            '],[' + ltrim((replace(std_industry_name,':','')))
                            FROM    [cs].[ma_deal_vintage_industry_statistics]
                            FOR XML PATH('')
                            ), 1, 2, '') + ']'
    
    SET @query =
    'SELECT * FROM
    (
        SELECT deal_key, replace(std_industry_name,'':'','''') std_industry_name,balance
        FROM [cs].[ma_deal_vintage_industry_statistics]
        where deal_key =''823155199''
    )t
    PIVOT (SUM(balance) FOR std_industry_name
    IN ('+@years+')) AS pvt for xml auto'
    
    EXECUTE (@query)
    

    【讨论】:

    • 在当前情况下无法进行替换,因为该列将在透视结果中显示空数据。
    • @user3290807 不,它不会,即使在我已替换的枢轴源查询中。从枢轴中删除for xml auto 尝试运行我的查询。
    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多