我正在尝试弄清楚如何有效地进行双重不分解。
我知道不细分;它将选定的列(向导,苹果,香蕉,书籍(塞入两个列中,通常是分类描述符和值本身 - 这两个新列需要名称(sutt_type,sutp_count(。
(。有时,尽管您有一系列的集合,并且希望两者都不细分。例如
apple_count, apple_weight, wizard_count, wizard_weight, book_count, book_weight
1, 12.0, 2, 23.0, 3, 34.0
是否有一种有效的方法可以不细分这两个列?因此,从本质上讲,您将返回以下内容:
Item_Name, Item_Weight, Item_Count
apple 12.0 1
wizard 23.0 2
这是否需要两个未分割,还是有更有效的方法?
在这里可以更优雅地使用交叉?
这是一个选项,它将"动态"不使用Dynamic SQL而"动态"地删除您的数据。我在这里使用辅助TVF,但是可以轻松地将其转换为十字架
示例
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
*/