逆透视列 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;
这是一种技术,可以 "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
是可选的。
我有一些关于某个人的信息,我想在两行而不是多列中显示。
我希望列为 "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;
这是一种技术,可以 "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
是可选的。