【问题标题】:Unpivot all other columns取消透视所有其他列
【发布时间】:2021-12-23 11:57:51
【问题描述】:

我是堆栈溢出和 SQL 的新手,我正在尝试在 Microsoft Power Query 中复制一个函数以在 SQL 中使用。

我知道如何 Unpivot 并在 SQL 中保留 1 列,然后必须按名称引用所有其他列才能进行 unpivot。

现在我需要保留 3 个 ID 列并取消透视其余列 (此表目前有 355 列,以后会有所变化)

谁能帮我解决这个问题?

这是我得到的最远的(感谢 Youtube 上的 RAV DBLearning),但我似乎找不到将列类型转换为 1 类型的方法。

DECLARE 
@SQLSTRING NVARCHAR(MAX),
@COLUMNLIST NVARCHAR(1000) = ''

SELECT
@COLUMNLIST = @COLUMNLIST + QUOTENAME(NAME) + ','
FROM
sys.columns
WHERE 
OBJECT_ID = OBJECT_ID('xp.XPROPERTYVALUES') AND
--COLUMN_ID NOT IN(1,2,3)
COLUMN_ID IN(452,453,454)

SELECT 
@COLUMNLIST = LEFT(@COLUMNLIST,LEN(@COLUMNLIST)-1)

SET 
@SQLSTRING = 
'
SELECT 
upv.id,
upv.item_id,
upv.itemtype_id,
upv.X_Category,
upv.X_Values
FROM 
xp.XPROPERTYVALUES
UNPIVOT
(
X_Values FOR X_Category 
IN 
(' + @COLUMNLIST + ')
) AS upv
'

PRINT 
(@SQLSTRING)
EXECUTE 
sp_executesql @SQLSTRING

【问题讨论】:

    标签: sql-server tsql dynamic-sql


    【解决方案1】:

    它只需要一个源查询。
    您可以为此重复使用计算出的列列表。

    DECLARE @SQLSTRING NVARCHAR(MAX), 
            @COLUMNLIST NVARCHAR(MAX);
    
    DECLARE @TABLENAME VARCHAR(30) = 'xp.XPROPERTYVALUES';
    
    SELECT @COLUMNLIST = CONCAT(@COLUMNLIST + ', ', QUOTENAME(NAME)) 
    FROM sys.columns
    WHERE OBJECT_ID = OBJECT_ID(@TABLENAME) 
      AND LOWER(NAME) NOT LIKE '%id';
    
    SET @SQLSTRING = N'SELECT upv.id
    , upv.item_id, upv.itemtype_id
    , upv.X_Category, upv.X_Values
    FROM 
    (
     SELECT id, item_id, itemtype_id, 
     '+  @COLUMNLIST + N' 
     FROM '+ @TABLENAME +N'
    ) src
    UNPIVOT
    (
      X_Values FOR X_Category IN (' + @COLUMNLIST + N')
    ) upv';
    
    -- SELECT @SQLSTRING;
    EXECUTE sp_executesql @SQLSTRING;
    

    db小提琴here

    【讨论】:

    • 不命名要更改的列?
    • 我尝试只是复制粘贴您发送的代码,我得到了同样的错误 :( Msg 8167, Level 16, State 1, Line 12 The type of column "XP-XP_FT_SIZE$IS_DEFINED" 与UNPIVOT 列表中指定的其他列的类型。
    • Robert651723 哦,伙计们。导致枢轴麻烦的不同数据类型......这使事情变得复杂。如果您不需要有问题的列,那么只需在 sys.columns 的查询中避免它们。不知道如何将它们投射到 unpivot 中。
    • 无论如何。您需要确定导致问题的列的类型。然后为您的问题添加一个包含几列的表的简化创建语句。让我们更容易测试解决方案是否可行。
    猜你喜欢
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多