2017-12-28 12 views
1

私の現在の質問は次のとおりです。目的は、最初の入金から30日以内に少なくとも500ドルの預金を受け取った口座を見つけることです。いくつかのアカウントは閉じられ、再オープンされているため、 'WHERE'句の最初の行です。 NO「」を有する句がなかったかのようにSQL - 結果がグループ化され、having句でフィルタリングされた後、どのようにして列を集計できますか?

and   sum(Deposits.amount) >= 500 

、アカウントのすべてのトランザクションを含めている:

select  Deposits.accountNumber, 
      min(Deposits.transDate) as "first deposit", 
      Deposits.transDate, 
      CAST(DATEADD(d,30,min(Deposits.transDate)) as date) as "30 days", 
      sum(Deposits.amount) as "sum", 
      Deposits.amount, 
      Members.accountOpenDate 
from  Deposits 
inner join Members on Deposits.accountNumber = members.accountNumber 
where  Deposits.transDate >= members.accountOpenDate 
and   Deposits.accountNumber = 123456 
group by Deposits.accountNumber 
having  Deposits.transDate between min(Deposits.transDate) and DATEADD('d',30,min(Deposits.transDate)) 
and   sum(Deposits.amount) >= 500 

私はに実行しています問題は、HAVING文の最後の行があることです。それはHAVING "の最初の行から除外されたトランザクションを加味されています。ここでは

having  Deposits.transDate between min(Deposits.transDate) and DATEADD('d',30,min(Deposits.transDate)) 

は私のデータは、(口座番号によってグループ化せずに)次のようになります。

accountNumber amount sum 
123456   $100  $6,500 
123456   $50  $6,500 
123456   $50  $6,500 

そしてここにはあります私が手に入れようとしているもの:

accountNumber amount sum 
123456   $100  $200 
123456   $50  $200 
123456   $50  $200 

ありがとうございます。私のDBMSはIntersystems-Cacheです。参照番号へのリンクはHereです。あなたが最初に、あなたが

+0

データベースでサポートされているかどうかは不明ですが、SELECTでそのクエリをラップすることもできます。例:SELECT * FROM(あなたの質問はここにあります)i WHERE SUM(i.amount)> = 500 –

答えて

1

あなたはそのような何かを試すことができます我々は明確化が必要です: 1. 30日間のウィンドウ内に3つの取引をすべて表示していますか?はいの場合、合計は500ドル未満です。したがって、このアカウントはスキップする必要があります。 2.オープン・デートよりも$ 6500が全トランスの合計であるため、なぜそれを計算するのですか?あなたは30日の窓だけを気にします。

それ以外にも、HAVING句の日付計算が切断されていると思います。 SELECTではMINを使用しますが、HAVINGでは完全に異なる集計日計算を使用します。私は計算をHAVINGから取り出し、それをWHEREの一部にするべきだと思います。

もちろん、これを行うと、MINをSELECTから取り除かなくてはなりません。

+0

答えをOPと将来の読者に説明してください。 – Parfait

+0

これはうまくいった!本当にありがとう。変更する必要があるのは、外部でSELECT *を実行し、それを動作させるためにすべてをサブクエリに移動する必要があることだけです。それ以外は、ありがとう! –

0

量の合計にフィルタを操作することができTRANSDATE条件を適用してデータをフィルタリングしている1つのようなクエリで

select  filtered.accountNumber, 
      min(filtered.transDate) as "first deposit", 
      filtered.transDate, 
      CAST(DATEADD(d,30,min(filtered.transDate)) as date) as "30 days", 
      sum(filtered.amount) as "sum", 
      filtered.amount, 
      filtered.accountOpenDate 
from   
(
    select * from Deposits 
    inner join Members on Deposits.accountNumber = members.accountNumber 
    where  Deposits.transDate >= members.accountOpenDate 
    and   Deposits.accountNumber = 123456 
    having  Deposits.transDate between min(Deposits.transDate) and DATEADD('d',30,min(Deposits.transDate)) 
) as filtered 
group by filtered.accountNumber 
having sum(filtered.amount) >= 500 

+0

こんにちは@teebark。あなたの質問に答えるために、1:はい、3つのトランザクションは30日のウィンドウ内にあります。はい、それはスキップする必要がありますが、合計で$ 6500として表示されている結果にまだ表示されます。私はそれを計算しようとはしていないが、それは私に、「どこに」の因数分解を行った後に生成されるすべてのトランザクションの合計を与えている。残念ながら、それは私のすべての問題を解決するだろうが、私のDBMSは 'どこに'集約を許可しません。ご返信ありがとうございます。 –

+0

私が見ているdateaddのドキュメントでは、最初のparmは引用符なしでdまたはdayのいずれかでなければなりません。 – teebark

関連する問題