SQL Server-取消透视(两次)或交叉申请双重取消透视?

时间:2019-05-22 16:34:43

标签: sql-server unpivot cross-apply

我正在尝试找出如何有效地执行两次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)

这是否需要两个枢纽,还是有一种更有效的方法?

十字架会在这里更优雅吗?

1 个答案:

答案 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
*/