我有一个关于特定人的信息,我想在两行而不是多列中显示。
我希望这些列为“ 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中获取列名,但是我无法将它们与表相关联,因此也必须取消其透视表。
有没有办法将这一行变成两列,包括列名和该列中的数据?
任何帮助,链接或指导,将不胜感激。
谢谢
会。
答案 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;
答案 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
是可选的。