我正在尝试找出如何有效地执行两次Unpivot。
我知道Unpivot;它将选定的列(向导,苹果,香蕉,书籍)放入两列,通常是分类描述符和值本身-这两个新列需要名称(Stuff_type,Stuff_count)。
有时候,尽管您有很多列,但想同时取消这两个列。如
python shape_counter.py -i C:\input_01.png -o C:\output_011.png
是否有一种有效的方法可以同时取消这两列?因此,实质上,您将返回以下内容:
SELECT * FROM users WHERE (email IS NULL) OR id IN(0, 1, 2)
这是否需要两个枢纽,还是有一种更有效的方法?
十字架会在这里更优雅吗?
答案 0 :(得分:1)
这里是一个选项,可以“动态”取消透视数据,而无需实际使用Dynamic SQL。我在这里使用辅助TVF,但可以轻松将其转换为CROSS APPLY
示例
Select Item_Name = left(Item,charindex('_',Item+'_')-1)
,Item_Weight = max(case when Item like '%_weight' then convert(decimal(10,1),Value) end)
,Item_Count = max(case when Item like '%_count' then convert(int,Value) end)
From YourTable A
Cross Apply [dbo].[tvf-XML-UnPivot-Row]((Select A.* for XML Raw)) b
Group By left(Item,charindex('_',Item+'_')-1)
返回
Item_Name Item_Weight Item_Count
apple 12.0 1
book 34.0 3
wizard 23.0 2
感兴趣的功能
CREATE FUNCTION [dbo].[tvf-XML-UnPivot-Row](@XML xml)
Returns Table
As
Return (
Select Item = xAttr.value('local-name(.)', 'varchar(100)')
,Value = xAttr.value('.','varchar(max)')
From @XML.nodes('//@*') xNode(xAttr)
)
/*
Select A.ID
,B.*
From YourTable A
Cross Apply [dbo].[tvf-XML-UnPivot-Row]((Select A.* for XML RAW)) B
*/