我设法应用您建议的PIVOT语句,将表的记录值自动转换为列:
DECLARE @PivotColumnas VARCHAR(MAX)
SELECT @PivotColumnas = COALESCE (@PivotColumnas + ',[' + IB_PDSBATCHATTRIBIDBI + ']', '[' + IB_PDSBATCHATTRIBIDBI + ']') FROM PDSBATCHATTRIB
DECLARE @PivotTablaSQL NVARCHAR(MAX)
SET @PivotTablaSQL = N' SELECT *
FROM (SELECT INVENTBATCHID, ITEMID, PDSBATCHATTRIB.IB_PDSBATCHATTRIBIDBI, PDSBATCHATTRIBVALUE FROM PDSBATCHATTRIBUTES
LEFT JOIN PDSBATCHATTRIB ON PDSBATCHATTRIBUTES.IB_PDSBATCHATTRIBIDBI = PDSBATCHATTRIB.IB_PDSBATCHATTRIBIDBI) AS TablaOrigen
PIVOT
(MIN(PDSBATCHATTRIBVALUE)
FOR IB_PDSBATCHATTRIBIDBI IN ('+ @PivotColumnas + ')) AS PivotTable'
EXECUTE (@PivotTablaSQL)
我需要的是如何将结果保存为查询或从此查询创建表。如果我尝试将结果保存为查询,则会出现以下错误:
关键字'DECLARE'附近的语法不正确。
谢谢!
答案 0 :(得分:0)
因为它是动态sql,并且您不知道确切的列,所以可以使用SELECT ... INTO #TempPivot。它正在创建一个临时表,您可以在以后使用,或尝试构建一个动态解决方案,可以选择临时表的结构并创建一个表,但它似乎有点矫枉过正。
答案 1 :(得分:0)
我找到了解决方案,其实很简单!
我只需在数据透视表的INTO NewTable
句中添加命令SELECT
,就像那样:
SET @PivotTablaSQL = N' SELECT * **INTO NewTable**
FROM (SELECT INVENTBATCHID, ITEMID, PDSBATCHATTRIB.IB_PDSBATCHATTRIBIDBI, PDSBATCHATTRIBVALUE FROM PDSBATCHATTRIBUTES
LEFT JOIN PDSBATCHATTRIB ON PDSBATCHATTRIBUTES.IB_PDSBATCHATTRIBIDBI = PDSBATCHATTRIB.IB_PDSBATCHATTRIBIDBI) AS TablaOrigen
PIVOT
(MIN(PDSBATCHATTRIBVALUE)
FOR IB_PDSBATCHATTRIBIDBI IN ('+ @PivotColumnas + ')) AS PivotTable'
这将在数据库数据库中创建一个带有数据透视表结果的新表。 谢谢大家!