如何循环SQL Server透视查询

时间:2016-05-24 02:29:49

标签: sql-server pivot

在开始阅读之前,如果以下说明太长,您将无法阅读以下代码。

请你可以覆盖它,只看最后一行。

我使用游标进行这种正常的循环查询,效果很好。

DECLARE db_cursor CURSOR FOR 
    Select top 100 percent
        [students].stu_id as StuID, Major_ID,MajorSeq,
        SysDate, Points
    From 
        [dbo].[StudentRegsterations] 
    inner join 
        [dbo].[students] on [dbo].[StudentRegsterations].Stu_ID = [dbo].[students].stu_id 
    order by 
        [Points] desc, [SysDate] desc;

DECLARE @StuID [int];
DECLARE @Major_ID [int];
DECLARE @MajorSeq [int];
DECLARE @SysDate [date];
DECLARE @Points [decimal](10, 2);

OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @StuID, @Major_ID, @MajorSeq, @SysDate, @Points;

WHILE @@FETCH_STATUS = 0
BEGIN
   --Do stuff with scalar values
   --InsertThisStudent()
   print CAST(@Points as varchar(10)) + '  -  ' + CAST(@SysDate as varchar(20))

   FETCH NEXT FROM db_cursor INTO @StuID, @Major_ID, @MajorSeq, @SysDate, @Points;
END;

CLOSE db_cursor;
DEALLOCATE db_cursor;

以上查询循环抛出正常选择。

但如果我将其更改为pivot查询,则会给我以下错误。

  

Msg 16924,Level 16,State 1,Line 31
  Cursorfetch:INTO列表中声明的变量数必须与所选列的变量数相匹配。

导致错误的数据透视查询就是这个。

DECLARE db_cursor CURSOR FOR 
    SELECT *
    FROM
        (Select top 100 percent
             [students].stu_id as StuID, SysDate, Points, MajorSeq, Major_ID
         From 
             [dbo].[StudentRegsterations] 
         inner join 
             [dbo].[students] on [dbo].[StudentRegsterations].Stu_ID = [dbo].[students].stu_id) WorkOrders
PIVOT
(
  max(Major_ID)
  FOR [MajorSeq] IN (
    [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],
    [11],[12],[13],[14],[15],[16],[17],[18],[19],[20]
  )
) AS PivotTable 
order by [Points] desc,[SysDate] desc

DECLARE @StuID [int];
DECLARE @Major_ID [int];
DECLARE @MajorSeq [int];
DECLARE @SysDate [date];
DECLARE @Points [decimal](10, 2);
DECLARE @1 [int];DECLARE @2 [int];DECLARE @3 [int];DECLARE @4 [int];DECLARE @5 [int];DECLARE @6 [int];DECLARE @7 [int];
DECLARE @8 [int];DECLARE @9 [int];DECLARE @10 [int];DECLARE @11 [int];DECLARE @12 [int];DECLARE @13 [int];DECLARE @14 [int];
DECLARE @15 [int];DECLARE @16 [int];DECLARE @17 [int];DECLARE @18 [int];DECLARE @19 [int];DECLARE @20 [int];

OPEN db_cursor;

FETCH NEXT FROM db_cursor INTO  @StuID, @Major_ID, @MajorSeq, @SysDate, @Points,
@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19,@20;

WHILE @@FETCH_STATUS = 0
BEGIN
   --Do stuff with scalar values
   --InsertThisStudent()
   print CAST(@Points as varchar(10)) + '  -  ' + CAST(@SysDate as varchar(20))

   FETCH NEXT FROM db_cursor INTO  @StuID, @Major_ID, @MajorSeq, @SysDate, @Points, @1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19,@20;
END;

CLOSE db_cursor;
DEALLOCATE db_cursor;

简要介绍我想要的所有内容,使用任何SQL Server方式循环使用数据透视查询,使用任何小代码示例,不使用我的代码。

1 个答案:

答案 0 :(得分:0)

将您的数据透视查询的结果保存到临时表(使用INTO #TempTable)并循环#TempTable。

EDIT。但是它也应该与您的代码一起使用。也许尝试CLOSE db_cursor并再次执行它。我认为你已经有了一些导致问题的db_cursor定义。