创建具有不同列数的临时表 - 似乎不会创建额外的列

时间:2015-02-25 10:25:10

标签: sql stored-procedures sql-server-2012

我必须设计一种报告,其方式与数据当前存储在数据库中的方式不同。

表A中有一列,其中包含许多费用的名称,在此报告中,我必须在这一列中收取每笔费用,并将它们与其他数据放在各自的列中。我的想法是创建一个临时表(表B)并填充表并在下面的存储过程中返回它(原谅我可怕的绘画技巧)

enter image description here

我看了一下Stack Overflow并尝试了我找到的解决方案:

Procedure to create a table with a variable number of columns

我的代码如下(我还没有包含像Begin / End这样的关键字)

我使用第一个表#tempChargeTypeTable来记录所有的收费类型,这很好。

--Declare temporary table to hold different charges in.
CREATE TABLE #tempChargeTypeTable  
(
    ChargeName NVARCHAR(50)
)

--Declare variable to hold value name through each loop
DECLARE @ColumnName NVARCHAR(50)

--Cursor for running through the the chargeTypeTable
DECLARE ChargeCursor CURSOR FOR SELECT ChargeName FROM #tempChargeTypeTable

--Declare variables for dynamic sql query
DECLARE @sqlQuery NVARCHAR(4000)

--Populate the temporary charge type table
INSERT INTO #tempChargeTypeTable 
SELECT DISTINCT ChargeType.Name
FROM dbo.ChargeType

下面是创建临时表来保存报表所需的所有数据,但它似乎并没有创建表,尽管代码构建正常但没有错误

--Create a new table to hold all the information via a dynamic sql query

SET @sqlQuery = 'CREATE TABLE ##tempPaymentsAnalysisTable(MemberID NVARCHAR(50) ,FirstName NVARCHAR(50) ,
                                                           Surname NVARCHAR(50) , CategoryName NVARCHAR(50) ,'


OPEN ChargeCursor

FETCH NEXT FROM #tempChargeTypeTable INTO @ColumnName

WHILE @@FETCH_STATUS = 0
BEGIN

SET @sqlQuery = @sqlQuery + RTRIM(@ColumnName) + ' NVARCHAR(50), '

FETCH NEXT FROM ChargeCursor INTO @ColumnName

END

CLOSE ChargeCursor

DEALLOCATE ChargeCursor

SET @sqlQuery = @sqlQuery + ')'

EXEC  @sqlQuery


--SELECT Statement for Test
SET @sqlQuery = 'SELECT * FROM ##tempPaymentsAnalysisTable'
Exec @sqlQuery

我已经有一段时间了,我想我可能是我的查询错了。任何人都可以发现任何事情吗?

更新:我使用SQL Server 2012作为数据库

非常感谢

1 个答案:

答案 0 :(得分:0)

此处的示例数据是您可以尝试查询的内容

enter image description here

希望这会对你有所帮助

CREATE TABLE #CourseSales
(Course VARCHAR(50),Year INT,Earning MONEY)
GO
--Populate Sample records
INSERT INTO #CourseSales VALUES('.NET',2012,10000)
INSERT INTO #CourseSales VALUES('Java',2012,20000)
INSERT INTO #CourseSales VALUES('.NET',2012,5000)
INSERT INTO #CourseSales VALUES('.NET',2013,48000)
INSERT INTO #CourseSales VALUES('Java',2013,30000)
GO

SELECT * FROM #CourseSales



DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)

--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
       + QUOTENAME(Course)
FROM (SELECT DISTINCT Course FROM #CourseSales) AS Courses

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
  N'SELECT Year, ' + @ColumnName + '
    FROM #CourseSales
    PIVOT(SUM(Earning) 
          FOR Course IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery