用列标题取消透视-单行

时间:2019-02-18 12:49:50

标签: sql-server tsql unpivot

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

我希望这些列为“ ColumnName”和“ ColumnData”

这是我返回单行的查询:

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中获取列名,但是我无法将它们与表相关联,因此也必须取消其透视表。

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

任何帮助,链接或指导,将不胜感激。

谢谢

会。

2 个答案:

答案 0 :(得分:2)

您可以像下面的查询一样使用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

答案 1 :(得分:0)

这是一种实际上可以“动态”取消透视表,视图或即席查询的任何技术,而无需实际使用动态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是可选的。