逆透视列 headers - 单行

Unpivoting with Column headers - single row

我有一些关于某个人的信息,我想在两行而不是多列中显示。

我希望列为 "ColumnName" 和 "ColumnData"

这是我对 return 单行的查询:

SELECT C.CUSTOMER_NAME
      ,CC.CONTACT_NAME
      ,CC.TELEPHONE
      ,CC.FAX
      ,CC.CONTACT_INITIALS
      ,CC.CONTACT_FIRSTNAME
      ,CC.EMAIL
      ,CC.CONTACT_DEAR
      ,CC.NUMERIC_PHONE_NO
      ,CC.TELEPHONE_NUMBER2
      ,CC.MOBILE_TELEPHONE
      ,CC.NUMERIC_TELEPHONE2
      ,CC.NUMERIC_MOBILE
      ,CC.NUMERIC_FAX
      ,CC.CONTACT_FULL_NAME
      ,CONTACT_MIDDLE_NAMES
FROM table C 
INNER JOIN table CC
ON C.column = CC.column
WHERE C.column = @CustomerAccount

我已尝试取消透视但未能成功,因为没有聚合并且每行只有一个值。

虽然我可以从 sys.columns 中获取列名,但我无法将它们与 table 相关联,而且还必须对它们进行逆透视。

有没有办法将这一行变成两列,包括列名和该列中的数据?

如有任何帮助、链接或指导,我们将不胜感激。

谢谢

会.

您可以像下面的查询那样使用UNPIVOT

;WITH cte 
     AS (SELECT C.customer_name, 
                CC.contact_name, 
                CC.telephone, 
                CC.fax, 
                CC.contact_initials, 
                CC.contact_firstname, 
                CC.email, 
                CC.contact_dear, 
                CC.numeric_phone_no, 
                CC.telephone_number2, 
                CC.mobile_telephone, 
                CC.numeric_telephone2, 
                CC.numeric_mobile, 
                CC.numeric_fax, 
                CC.contact_full_name, 
                contact_middle_names 
         FROM   table C 
                INNER JOIN table CC 
                        ON C.COLUMN = CC.COLUMN 
         WHERE  C.COLUMN = @CustomerAccount) 
SELECT u.x AS ColumnName, 
       u.y AS ColumnValue 
FROM   cte s 
       UNPIVOT ( [y] 
               FOR [x] IN (customer_name, 
                           contact_name, 
                           telephone, 
                           fax, 
                           contact_initials, 
                           contact_firstname, 
                           email, 
                           contact_dear, 
                           numeric_phone_no, 
                           telephone_number2, 
                           numeric_mobile, 
                           numeric_fax, 
                           contact_full_name, 
                           contact_middle_names) ) u; 

Online Demo

这是一种技术,可以 "dynamically" 反透视几乎任何 table、视图或临时查询,而无需实际使用动态 SQL

显然 UNPIVOT 会更高效,但您不必在此处指定列名。

例子

Select C.*
 From  ( Your table or Query Here ) A
 Cross Apply ( values (cast((Select A.* for XML RAW) as xml))) B(XMLData)
 Cross Apply (
               Select Item  = xAttr.value('local-name(.)', 'varchar(100)')
                     ,Value = xAttr.value('.','varchar(max)')
                From  XMLData.nodes('//@*') xNode(xAttr)
                Where xAttr.value('local-name(.)','varchar(100)') not in ('Columns','ToExclude')
             ) C

我应该注意 WHERE 是可选的。