2017-12-28 4 views
1

내 현재 검색어입니다 : 첫 번째 입금 후 30 일 이내에 입금액이 500 달러 이상인 계정을 찾는 것이 목표입니다. 일부 계정이 닫히고 다시 열리므로 'WHERE'절의 첫 번째 줄이 표시됩니다. 더 'HAVING'조항이 없었다 것처럼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 구문의 마지막 줄 것입니다 .

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

그리고 여기에 있습니다 :

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

내 데이터 (계좌 번호로 그룹화없이) 모습입니다 : 그것은 'HAVING'의 첫 번째 줄에서 제외됩니다 거래에서 인수 분해한다 내가 무엇을 얻으려고하는지 :

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

당신은 그런 걸 시도 할 수 있습니다 : 당신이 먼저 당신이 금액의 합계에 필터를 작동 할 수 transDate 조건을 적용하여 데이터를 필터링하는 하나 같은 쿼리로

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

OP와 미래의 독자들에게 귀하의 답을 설명하십시오. – Parfait

+0

이것은 효과가 있습니다! 정말 고마워. 변경할 필요가있는 것은 외부에서 SELECT *를 선택하고 모든 것을 하위 쿼리로 이동해야만 작동하도록 할 수 있다는 것입니다. 그 외, 고마워! –

0

우리는 명확한 설명이 필요합니다 : 1. 30 일 이내에 모든 3 가지 거래가 표시됩니까? 그렇다면 합계는 500 달러 미만입니다. 따라서이 계정은 건너 뜁니다. 2. $ 6500은 오픈 데이트보다 큰 모든 트랜스의 합계이기 때문에 왜 계산합니까? 당신은 30 일간의 창만을 걱정합니다.

그 외에도 HAVING 절의 날짜 계산이 끊어 졌다고 생각합니다. SELECT에서 MIN을 사용하지만 HAVING에서 완전히 다른 집계 날짜 계산을 사용합니다. 나는 당신이 계산에서 그것을 가지고 있어야하고 그것을 부분의 일부로 만들어야한다고 생각합니다.

물론, 일단 그렇게하면, SELECT에서 MIN을 가져와야합니다.

+0

안녕하세요. 귀하의 질문에 대답하려면, 1 : 그렇습니다, 그 3 거래가 30 일 이내에 있으며 예, 건너 뛰어야합니다. 그러나 합계가 $ 6500로 표시 되어도 여전히 결과에 표시됩니다. 2. 나는 그것을 계산하려고하지 않고 있지만, 'where'에 인수 분해 한 후에 생성되는 모든 거래의 합계를 나에게주는 것이지만, 'having'에 결과를 제외시키지 않기 때문에 내 문제가된다. 불행히도, 그건 내 모든 문제를 해결할 것입니다,하지만 내 DBMS는 '어디에'집계를 허용하지 않습니다. 당신의 답변에 감사드립니다. –

+0

내가보기에 dateadd에 대한 문서에서 첫 번째 매개 변수는 따옴표없이 d 또는 하루 여야합니다. 그렇게 할 수 있습니까? – teebark

관련 문제