【发布时间】:2015-02-25 10:25:10
【问题描述】:
我必须设计一个报告,其布局方式与数据当前在数据库中的存储方式不同。
表 A 中有一列,其中包含许多费用的名称,在此报告中,我必须将这一列中的每项费用与其他数据一起放在各自的列中。我的想法是创建一个临时表(表 B)并填充该表并将其返回到如下所示的存储过程中(请原谅我糟糕的绘画技巧)
我查看了堆栈溢出并尝试了我找到的这个解决方案:
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
非常感谢
【问题讨论】:
-
哪个 dbms? (看起来不像 ANSI SQL...)
-
抱歉忘了提,我使用的是 SQL Server 2012 和 Management Studio。我会更新我的问题
-
你有没有研究过枢轴它可以将行转换为列。发布一些示例数据和示例报告,说明您希望报告的外观。
-
老实说,我现在会查找一些有关它的文档并将一些示例数据返回给您。
-
您不会删除 ##temp 表,该表将保留在范围内,直到您删除它。请参阅stackoverflow.com/questions/7887011/… 了解如何操作。
标签: sql stored-procedures sql-server-2012