从查询创建表

时间:2012-08-24 15:20:25

标签: sql sql-server

我设法应用您建议的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'附近的语法不正确。

谢谢!

2 个答案:

答案 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' 

这将在数据库数据库中创建一个带有数据透视表结果的新表。 谢谢大家!