我想知道SQL Server中是否可以使用以下内容 - 它涉及游标使用,我不确定如何将其置于函数内部或存储过程。
你会推荐什么?
TABLEA
包含以下列:
Column1, Column2
实施例
Column1 Column2
------- -------
anna a
anna b
ben b
john c
john b
john a
第2列中的可能值为:a,b和c(Column1上的某个值没有重复)
创建TABLEB
结构:Column1 Column3 Column4 Column5.
TABLEA
SELECT * FROM TABLEB WHERE Column1 = (cursor row).Column1
如果以前的选择没有返回任何行,
在TABLEB
中插入一行Column1 = (cursor row).Column1
,在第3列,第4列和第5列上插入NULL值。
If(从前一个选择返回的行)> 0:
{ 如果TABLEB.Column3不为null,则使用(游标行).Column2
更新TABLEB否则如果TABLEB.Column4不为null,则使用(游标行)更新TABLEB .Column2
否则如果TABLEB.Column5不为null,则使用(游标行)更新TABLEB .Column2 }
END光标循环
如您所见,我非常清楚我想做什么,但语法很少或者在这种情况下建议使用什么。
输出应该在以下步骤之后:
Column1 Column3 Column4 Column5
------ ------- ------- -------
anna a b
ben b
john c b a
我最感兴趣的是如果可以使用游标,如果有的话,你有学习语法的提示/教程,你建议我将这个例子集成到一个过程/函数中吗?
谢谢!
LATER EDIT:
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
您会注意到与第一个和所需输出的区别。
答案 0 :(得分: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
答案 1 :(得分: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