2010-03-30 2 views
4

money_spent, money_spent_on_candy 및 날짜와 같은 사용자 값을 기록하는 테이블이 있습니다. SQL : HAVING 문을 충족하는 결과에 SUM이 필요합니다.

그래서이 테이블 (의이 MoneyTable를 부르 자)의 열은 다음과 같습니다

  • 사용자 아이디
  • Money_Spent
  • Money_Spent_On_Candy
  • 날짜

내 목표는 합계하는 것입니다 총 money_spent 금액 - 해당 날짜에 소비 한 총 금액의 10 % 이상을 지출 한 사용자 만 해당 사탕의 범위.

그 검색어는 무엇입니까?

나는 이것을 가진 사용자를 선택하는 방법을 알고 있습니다. 그런 다음 손으로 데이터와 합계를 출력 할 수 있지만 이것을 하나의 단일 쿼리로 수행하고 싶습니다.

사탕에 돈의 10 % 이상을 소비 한 사용자에 대해서만 사용자 당 지출액을 가져 오는 쿼리가 있습니다.

SELECT 
    UserId, 
    SUM(Money_Spent), 
    SUM(Money_Spent_On_Candy)/SUM(Money_Spent) AS PercentCandySpend 
FROM MoneyTable 
WHERE DATE >= '2010-01-01' 
HAVING PercentCandySpend > 0.1; 

답변

3

합니다. 이전에 도달 할 수있는 쿼리가 필요하고 소급 소비가 10 % 인 사용자 만 처리하도록 소스 테이블을 소급하여 필터링 할 수 있습니다. 다행히, 그 하위 쿼리가하는 일의 종류의 :

SELECT SUM(spent) FROM (
    SELECT SUM(Money_Spent) AS spent 
    FROM MoneyTable 
    WHERE (DATE >= '2010-01-01') 
    GROUP BY UserID 
    HAVING (SUM(Money_Spent_On_Candy)/SUM(Money_Spent)) > 0.1 
); 

내부 쿼리는 "10 %"사용자가 보낸 것을 파악의 무거운 작업을 수행 한 후 외부 쿼리가 가상으로 하위 쿼리를 사용 표를 사용하여 사용자 당 Money_Spent 금액을 합산합니다.

물론 Money_Spent 만 필요한 경우에만 작동합니다. 사용자 당 합계가 필요하면 결국 내부 쿼리를 실행하고 애플리케이션에서 전체 합계를 수행하는 것이 좋습니다.

+0

답장을 보내 주셔서 감사합니다. – Wasauce

+0

SQL Server 2005의 경우 끝에 테이블 별칭을 추가하십시오. ....> 0.1 ) 표식; –

1

공통 테이블 표현식을 사용할 수 있습니다. 이처럼 :

WITH temp AS (SELECT 
    UserId, 
    SUM(Money_Spent) AS MoneySpent, 
    SUM(Money_Spent_On_Candy)/SUM(Money_Spent) AS PercentCandySpend 
FROM MoneyTable 
WHERE DATE >= '2010-01-01' 
HAVING PercentCandySpend > 0.1) 
SELECT 
    UserId 
    SUM(MoneySpent) 
FROM UserId 
1

아니면 파생 테이블을 사용할 수 있습니다 : 당신은 단일 쿼리로이 작업을 수행 할 수

SELECT SUM(Total_Money_Spent) 
FROM ( SELECT UserId, Total_Money_Spent = SUM(Money_Spent), SUM(Money_Spent_On_Candy)/SUM(Money_Spent) AS PercentCandySpend 
      FROM MoneyTable 
      WHERE DATE >= '2010-01-01' 
      HAVING PercentCandySpend > 0.1) x;