SQL Server语言 - Undivot(Double)或Cross申请双重UNPIVOT



我正在尝试弄清楚如何有效地进行双重不分解。

我知道不细分;它将选定的列(向导,苹果,香蕉,书籍(塞入两个列中,通常是分类描述符和值本身 - 这两个新列需要名称(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
*/

相关内容

  • 没有找到相关文章

最新更新