2016-06-29 7 views
1

トランザクションレコードをタイプ 'C'で、レコードのポストタイムがタイプ ' W 'であり、口座番号と郵便日付は同じです。私はif/thenを作成することに苦しんでいます。タイプ 'C'のための郵便配達時間= 'W'タイプの郵便配達時間。私は前にこれらのタイプをしましたが、レコード項目が1つしかない同じフィールドでは決してしませんでした。同じフィールドに複数の基準がある場合のSQL SSMS

+0

あなたは、いくつかのコンテキストを追加しようとしましたいくつかのコード/ SQLクエリを追加してみてもらえますか? – FishStix

+0

いくつかのサンプルデータと望ましい結果が最も役立ちます –

+0

最初の問題は、リレーショナルデータがあることと、今説明したものの大半がON述語とWHEREの 'predicate'節に属していることです。 –

答えて

0

、= 'W' JOINSrelational data setsSARGsと考えてください。

テーブル構造(非常に役立つ)をまだ私たちに与えていないのに、このソリューションはあなたを正しい方向に導くのに役立ちます。以下は、それ自体にcarnalityがMであるTRANSACTIONSFACTテーブルを前提としていますM

SELECT TOP 1000 A.ACTIONCODE, A.TRAN_RECORD --, any other needed columns 
FROM TRANSACTIONS A 
    INNER JOIN (SELECT ACTIONCODE, POSTTIME, ACCOUNT_NUM, POSTDATE 
       FROM TRANSACTIONS 
       WHERE ACTIONCODE = 'W') B ON A.ACCOUNT_NUM = B.ACCOUNT_NUM 
              AND A.POSTDATE = B.POSTDATE 
WHERE A.ACTIONCODE = 'C' 
    AND A.POSTTIME >= B.POSTTIME 

更新日:私は誤っ列の正確な数を含むことを忘れてしまいました。 INNER JOINで使用する列と同じ列(または気にしない場合は*)を必ず指定してください。

それにかかわらず、私たちは私たちが使用する結果や私たちのクエリで見る結果を返すだけで、クエリを最適化します。

+0

Clifton_hさん、ありがとうございました。心から感謝する! – jwilkins

+0

甘い。答えを解決済みとマークしてください。ありがとうございます。 :) –

+0

1日に複数のWを持つことができれば、重複してしまうでしょう。 – shawnt00

0

これは私が元々持っていたものですが、結果が出てこないSSMSで乱れてしまいました。基本的には、 'C'タイプのレコードが返される必要があります。 'W'タイプのレコードがある場合、 'C'よりも郵便料金が低くなりますが、レコードの勘定コードと郵便物の日付は同じです。 posttime、postdate、type、およびnumberはすべてテーブルのフィールドです。

SELECT *取引

FROM

WHERE ACTIONCODE = 'C' AND POSTTIME> = POSTTIMEとACTIONCODEあなたはを通して達成することができ記述する私が正しくあなたを理解していれば

+0

同じ列を参照するため、クエリが最も効率的なインデックスを使用できないことがあります(つまり、インデックス/テーブルのスキャンが行われる可能性があります)。 また、これは質問に付随しているはずでした。 xD –

+0

すぐに返されたはずです。 1つの行に複数の値を設定する方法はありません。 – shawnt00

1

これはexistsを使用する典型的な方法のようになります。

select * from transactions t 
where t.actioncode = 'C' and exists (
    select 1 from transactions t2 
    where t2.account_num = t.account_num and t2.postdate = t1.postdate 
     and t2.actioncode = 'W' 
     and t2.posttime < t1.posttime 
) 
関連する問題