2016-08-23 11 views
2

私は次の表T1があると:すべての行を効率的に反復するか?

| col1 | col2 | 
|------|------| 
| 0 | 0 | // A++ 
| 3 | 123 | // B++ 
| 0 | 5 | // C++ 
| 8 | 432 | // A++ 
| 0 | 4 | // B++ 

今(INSERTに)トリガーを作成する必要があり、すべての行を解析している、カウンタを増加させる(下記参照)の値とテーブルT2を移入カウンター:

| id | A | B | C | 
|----|---|---|---| 
| 1 | 1 | 2 | 2 | 
:この場合

IF col1 = 0 AND col2 = 0 
    A++ 
ELSE IF col1 = 0 col2 > 0 
    B++ 
ELSE IF col1 > 0 
    C++ 

T2は次のようになります。

私の質問はデザインの詳細です:HEREと記載されているように、実際に各行を繰り返し処理するか、より効率的な方法がありますか?

+0

T1のどの値が 'A'、' B'または 'C'のものであるかはどうやって判断しますか? –

+0

@RaduGheorghiu:私が提供した擬似コードを見てください。 – user1170330

+0

私はあなたがそれをしなければならない場合、あなたのデザインやアルゴリズムが悪いです、私はテーブルを繰り返すことはありません。 –

答えて

2

これは、行の繰り返しによって行を必要としない

;with data as 
(
SELECT Sum(CASE WHEN col1 = 0 AND col2 = 0 THEN 1 END) AS a, 
     Sum(CASE WHEN col1 = 0 AND col2 > 0 THEN 1 END) AS b, 
     Sum(CASE WHEN col1 > 0 THEN 1 END) AS c 
FROM (VALUES (0, 0), 
       (3, 123), 
       (0, 5), 
       (8, 432), 
       (0, 4)) tc (col1, col2) 
       ) 
UPDATE yt 
SET a = dt.a, 
     b = dt.b, 
     c = dt.c 
FROM yourtable yt 
     JOIN data dt 
     ON a.id = b.id 

トリガーにこのような何かを試してみてください。テーブル値のコンストラクタをInsertedテーブルに置き換えます。

1

これは、テーブルに書き込むべきではありません(何百万もの行がなく、パフォーマンスのために必要な場合を除き...)。 (

DECLARE @T1 TABLE(col1 INT,col2 INT); 
INSERT INTO @T1(col1,col2) VALUES 
(0,0) 
,(3,123) 
,(0,5) 
,(8,432) 
,(0,4); 

SELECT p.* 
FROM 
(
    SELECT CASE WHEN col1=0 AND col2=0 THEN 'A' 
       WHEN col1=0 AND col2>0 THEN 'B' 
       WHEN col1>0 THEN 'C' END AS Category 
    FROM @T1 AS t 
) AS tbl 
PIVOT 
(
    COUNT(Category) FOR Category IN(A,B,C) 
) AS p 

結果

A B C 
1 2 2 

そして私は、無効なデータをキャッチする(ELSEと)別のオプションを追加するようにお勧めします:あなたは、むしろこのようなオンザフライこの情報を取得する必要があります例えば負の値)。

関連する問題