1

我想知道在 SQL Server 中是否可以执行以下操作 - 它涉及游标的使用,我不确定如何将其放置在函数或存储过程中。

你会推荐什么?

TABLEA具有以下列:

Column1, Column2

例子

Column1 Column2
------- -------
anna     a
anna     b
ben      b
john     c
john     b
john     a 

列 2 中的可能值是:a、b 和 c(列 1 上的某个值没有重复项)

创建TABLEB结构:Column1 Column3 Column4 Column5.

  1. 有一个游标循环遍历所有行TABLEA
  2. SELECT * FROM TABLEB WHERE Column1 = (cursor row).Column1
  3. 如果前一个选择没有返回任何行,则在 Columns3、4 和 5 上插入一行到TABLEB具有和 NULL 值的值。Column1 = (cursor row).Column1

    如果(从先前选择返回的行)> 0:

    { 如果 TABLEB.Column3 不为空,则使用(光标行)更新 TABLEB.Column2

    否则,如果 TABLEB.Column4 不为空,则使用(光标行).Column2 更新 TABLEB

    否则,如果 TABLEB.Column5 不为空,则使用 (光标行).Column2 更新 TABLEB }

  4. 结束光标循环

如您所见,我非常清楚自己想要做什么,但对语法或在这种情况下推荐的内容知之甚少。

输出应在以下步骤之后:

Column1 Column3 Column4 Column5
------  ------- ------- -------
anna    a        b       
ben     b            
john    c        b       a

我最感兴趣的是是否可以使用游标,如果可以,您是否有任何学习语法的提示/教程,您是否建议我将示例集成到过程/函数中?

谢谢!

后期编辑:

podiluska,我尝试使用枢轴,如下所示:

CREATE VIEW VIEWB
AS SELECT [Column1], 
('Column2') AS [Source],
MAX( CASE Column2 WHEN 'a' THEN Column2 ELSE '' END ) Column3,         
MAX( CASE Column2 WHEN 'b' THEN Column2 ELSE '' END ) Column4,         
MAX( CASE Column2 WHEN 'c' THEN Column2 ELSE '' END ) Column5          
FROM TABLEA
GROUP BY [Column1];
GO 

这种方法的问题在于输出是:

Column1 Column3 Column4 Column5
------  ------- ------- -------
anna    a        b       
ben              b            
john    a        b       c

您会注意到与第一个输出和所需输出的不同。

4

2 回答 2

2

您可以使用光标,但我建议使用 PIVOT 代替,即:

 select column1, 
      case a when 0 then null else 'a' end,
      case b when 0 then null else 'b' end,
      case c when 0 then null else 'c' end
 from
      TableA as p
 pivot
      (Count(column2) for column2 in ([a],[b],[c]))
 as pt

如果你想移动列,试试这个......

 select column1,
      case when c3 is null then c4 else c3 end c3,
      case when c3 is null then c5 else c4 end c4,
      case when c3 is null then null else c5 end c5
 from
 (
 select column1,
    case when c3 is null then c4 else c3 end c3,
    case when c3 is null then c5 else case when c4 is null then c5 else c4 end end c4,
    case when c3 is null or c4 is null then null else c5 end c5
 from
 (
 select column1, 
    case a when 0 then null else 'a' end c3,
    case b when 0 then null else 'b' end c4,
    case c when 0 then null else 'c' end c5
 from
    #temp as p
 pivot
    (Count(column2) for column2 in ([a],[b],[c]))
 as pt
 ) v
 ) v2
于 2012-07-16T12:51:58.453 回答
0

你根本不需要光标。这很简单

select 
    column1,
    max(case when column2='a' then column2  end) as column1,
    max(case when column2='b' then column2  end) as column2,
    max(case when column2='c' then column2  end) as column3
from
    table
group by
    column1
于 2012-07-16T13:10:05.497 回答