2017-02-10 9 views
3

私は銀行の明細テーブルに照会するためにSQLを書き込もうとしていますが、5つの銀行明細書の列に「現金」が含まれている場合、 'AT、IN CHQ' または 'ELECTR CHARGE'複数の検索条件が複数の列に含まれています

私の現在の試みは

select statement_no 
     ,bank_text_1 
     ,bank_text_2 
     ,bank_text_3 
     ,bank_text_4 
     ,bank_text_5 
     ,amount 
     ,case 
      when bank_text_1 like '%SURPLUS CASH%' 
       or bank_text_1 like '%CHQ IN AT%' 
       or bank_text_1 like '%ELECTR CHARGE%' 
       or bank_text_2 like '%SURPLUS CASH%' 
       or bank_text_2 like '%CHQ IN AT%' 
       or bank_text_2 like '%ELECTR CHARGE%' 
       or bank_text_3 like '%SURPLUS CASH%' 
       or bank_text_3 like '%CHQ IN AT%' 
       or bank_text_3 like '%ELECTR CHARGE%' 
       or bank_text_4 like '%SURPLUS CASH%' 
       or bank_text_4 like '%CHQ IN AT%' 
       or bank_text_4 like '%ELECTR CHARGE%' 
       or bank_text_5 like '%SURPLUS CASH%' 
       or bank_text_5 like '%CHQ IN AT%' 
       or bank_text_5 like '%ELECTR CHARGE%' 
       then 'Exclude' 
      else '' 
     end as checker; 

それはとても混乱だと非常に効率的ないないようです。誰かが良い方法のための提案を持っていますか?

多くのおかげ

例の結果データ:

Statement_no | bank_text_1 | bank_text_2   | bank_text_3 | bank_text_4 | bank_text_5 | amount | checker 
0001   | SURPLUS CASH|      |    |    |    |125.00 |Exclude 
0002   | M THOMAS |TRAINING FEE   |CHQ IN AT 100217|    |    |470.00 |Exclude 
0003   |SWALEC  |Training Centre One |Abergaveny  |    |Electr Charges|700.00 |Exlcude 
0004   |M Thomas  |Training Centre Hire |    |    |    |850.00 | 
+0

JDBC(Java)やADO.NET(.NET)などの何らかのデータアクセスを使用している場合は、パラメータを使用できます。パラメータを使用すると、クエリはもはや乱雑になりません。私はあなたがすでに持っている方法を好むのは、維持しやすいからです。 – Loc

答えて

2

一つの選択肢は、CROSSが適用され

Select statement_no 
    , bank_text_1 
    , bank_text_2 
    , bank_text_3 
    , bank_text_4 
    , bank_text_5 
    , amount 
    , B.Checker 
From YourTable A 
Cross Apply (Select Checker = case when count(*)>0 then 'Exclude' else '' end 
       From (values (A.bank_text_1) 
        ,(A.bank_text_2) 
        ,(A.bank_text_3) 
        ,(A.bank_text_4) 
        ,(A.bank_text_5)) C1 (Value) 
       Where charindex('SURPLUS CASH',Value) 
        +charindex('CHQ IN AT',Value) 
        +charindex('ELECTR CHARGE',Value) 
        >0 
      ) B 

戻り

enter image description here

+0

優先度。本当にありがとう、ちょうど私が必要なもの。前に書いて、グーグルグーグルの週末。乾杯。 – BlueFrog

+0

@BlueFrogハッピーが助けてくれました。 CROSS APPLYは素晴らしい機能です。これをサブルーチンと見なします –

0

これは、ビット整然と見えますが、それは平等にかかわらず、実行する必要があります。

SELECT statement_no, 
     bank_text_1, bank_text_2, bank_text_3, bank_text_4, bank_text_5, 
     amount, 
     IIF(x.IsChecked = 1, 'Exclude', '') 
FROM mytable 
CROSS APPLY (
    SELECT SUM(CASE 
       WHEN (t.v LIKE '%SURPLUS CASH%') OR 
         (t.v LIKE '%CHQ IN AT%') OR 
         (t.v LIKE '%ELECTR CHARGE%') 
        THEN 1 
       ELSE 0 
       END) AS IsChecked 
    FROM 
    (  
     VALUES (bank_text_1), (bank_text_2), (bank_text_3), (bank_text_4), (bank_text_5) 
    ) AS t(v) 
) AS x 
+0

これは元の行あたり5行を返します。 http://rextester.com/BMYSM47521 – SqlZim

+0

@SqlZim申し訳ありません、私は今修正しました! –

0

をあなたは試してみてください:

select statement_no 
     ,bank_text_1 
     ,bank_text_2 
     ,bank_text_3 
     ,bank_text_4 
     ,bank_text_5 
     ,amount 
     ,case 
      when q.item is not null 
       then 'Exclude' 
      else '' 
     end as checker 
from queries 
left join 
(
     select '%CHQ IN AT%' item union 
     select '%ELECTR CHARGE%' item union  
     select '%SURPLUS CASH%' item 
) q on bank_text_1 like item or 
     bank_text_2 like item or 
     bank_text_3 like item or 
     bank_text_4 like item or 
     bank_text_5 like item 

を私はパフォーマンスについて私の意見ではわからないクロス結合が適用よりも軽いです。ベンチマークを共有することができれば、私は興味を持っていきます。

1
select * 
, checker = case 
    when charindex('SURPLUS CASH',concat(bank_text_1, bank_text_2, bank_text_3, bank_text_4, bank_text_5))>0 
     or charindex('CHQ IN AT',concat(bank_text_1, bank_text_2, bank_text_3, bank_text_4, bank_text_5))>0 
     or charindex('ELECTR CHARGE',concat(bank_text_1, bank_text_2, bank_text_3, bank_text_4, bank_text_5))>0 
     then 'Exclude' 
    else '' 
    end 
from t 

結果:http://rextester.com/VBOC27547

+--------------+---------------+-----------------------+------------------+-------------+----------------+--------+---------+ 
| statement_no | bank_text_1 |  bank_text_2  | bank_text_3 | bank_text_4 | bank_text_5 | amount | checker | 
+--------------+---------------+-----------------------+------------------+-------------+----------------+--------+---------+ 
|   0001 | SURPLUS CASH |      |     |    |    | 125,00 | Exclude | 
|   0002 | M THOMAS  | TRAINING FEE   | CHQ IN AT 100217 |    |    | 470,00 | Exclude | 
|   0003 | SWALEC  | Training Centre One | Abergaveny  |    | Electr Charges | 700,00 | Exclude | 
|   0004 | M Thomas  | Training Centre Hire |     |    |    | 850,00 |   | 
+--------------+---------------+-----------------------+------------------+-------------+----------------+--------+---------+ 

私は1,000,000行を超えるジョン・カペレッティの回答と比較して、こののパフォーマンスをテストし、私は彼らが同等であると言うでしょう。

私の個人的な好みは、cross apply()を使用してジョンの答えでしょう。

以下のセットでは、各セットの最初のクエリはcharindex(...,concat(..)を使用し、2番目のクエリはJohnのcross apply()バージョンを使用します。

このインスタンスのハードウェア仕様はかなり弱いですが、マイレージは変わります。

----------------------- 

(1000000 row(s) affected) 
Table 't'. Scan count 1, logical reads 8153, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

SQL Server Execution Times: 
    CPU time = 3010 ms, elapsed time = 8750 ms. 

(1000000 row(s) affected) 
Table 't'. Scan count 1, logical reads 8153, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

SQL Server Execution Times: 
    CPU time = 5585 ms, elapsed time = 8725 ms. 

----------------------- 

(1000000 row(s) affected) 
Table 't'. Scan count 1, logical reads 8153, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

SQL Server Execution Times: 
    CPU time = 3307 ms, elapsed time = 8685 ms. 

(1000000 row(s) affected) 
Table 't'. Scan count 1, logical reads 8153, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

SQL Server Execution Times: 
    CPU time = 5663 ms, elapsed time = 8913 ms. 

----------------------- 

(1000000 row(s) affected) 
Table 't'. Scan count 1, logical reads 8153, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

SQL Server Execution Times: 
    CPU time = 3073 ms, elapsed time = 8414 ms. 

(1000000 row(s) affected) 
Table 't'. Scan count 1, logical reads 8153, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

SQL Server Execution Times: 
    CPU time = 5647 ms, elapsed time = 9049 ms. 

------------------- 

(1000000 row(s) affected) 
Table 't'. Scan count 1, logical reads 8153, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

SQL Server Execution Times: 
    CPU time = 3011 ms, elapsed time = 8706 ms. 

(1000000 row(s) affected) 
Table 't'. Scan count 1, logical reads 8153, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

SQL Server Execution Times: 
    CPU time = 5491 ms, elapsed time = 8704 ms. 

----------------------- 
+0

余分に行く道+1 –

+0

@JohnCappellettiありがとう – SqlZim

関連する問題