创建具有不同列数的临时 table - 似乎并没有创建额外的列
Creating a temporary table with a varied number of columns - doesn't seem to be creating the extra columns
我必须设计一个报表,其布局方式与当前数据在数据库中的存储方式不同。
在TableA中有一栏,其中包含一些费用的名称,在这份报告中我必须将每项费用都放在这一栏中,并将它们与其他费用放在各自的栏中数据。我的想法是创建一个临时 table (Table B) 并在如下存储过程中填充 table 和 return 它(原谅我糟糕的绘画技巧)
我查看了堆栈溢出并尝试了我发现的这个解决方案:
Procedure to create a table with a variable number of columns
我的代码如下(我没有包含Begin/End等关键字)
我使用第一个 table #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
下面是创建临时 table 来保存报告所需的所有数据,但是尽管代码构建良好,它似乎根本没有创建 table没有错误
--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
非常感谢
这里有示例数据,您可以尝试查询
希望这对你有所帮助
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
我必须设计一个报表,其布局方式与当前数据在数据库中的存储方式不同。
在TableA中有一栏,其中包含一些费用的名称,在这份报告中我必须将每项费用都放在这一栏中,并将它们与其他费用放在各自的栏中数据。我的想法是创建一个临时 table (Table B) 并在如下存储过程中填充 table 和 return 它(原谅我糟糕的绘画技巧)
我查看了堆栈溢出并尝试了我发现的这个解决方案:
Procedure to create a table with a variable number of columns
我的代码如下(我没有包含Begin/End等关键字)
我使用第一个 table #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
下面是创建临时 table 来保存报告所需的所有数据,但是尽管代码构建良好,它似乎根本没有创建 table没有错误
--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
非常感谢
这里有示例数据,您可以尝试查询
希望这对你有所帮助
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