1

SQL Serverで次のことが可能かどうかを知りたいです-カーソルの使用が含まれており、それを関数またはストアドプロシージャ内に配置する方法がわかりません。

あなたは何をお勧めします?

TABLEA次の列があります。

Column1, Column2

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

column2 の可能な値は次のとおりです: a、b、および c (Column1 の特定の値の重複はありません)

構造を作成TABLEBする:Column1 Column3 Column4 Column5.

  1. のすべての行でカーソルをループさせます。TABLEA
  2. SELECT * FROM TABLEB WHERE Column1 = (cursor row).Column1
  3. 前の選択から行が返されない場合は、列3、4、および 5 に NULL 値をTABLEB持つ行を挿入します。Column1 = (cursor row).Column1

    (前の選択から返された行数) > 0 の場合:

    { TABLEB.Column3 が null でない場合、TABLEB を (カーソル行).Column2 で更新する

    それ以外の場合、TABLEB.Column4 が null でない場合、TABLEB を (カーソル行).Column2 で更新します。

    それ以外の場合、TABLEB.Column5 が null でない場合は、TABLEB を (カーソル行).Column2 } で更新します。

  4. END カーソルループ

ご覧のとおり、やりたいことはよくわかっていますが、この場合に推奨される構文や推奨事項はほとんどありません。

出力は次の手順の後にあるはずです。

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 に答える