2012-05-11 3 views
0

없이 SQL에서 계층 수준을 합산내가이처럼 보이는 SQL 서버 테이블이 커서

1,2012-05-10,300 
2,2012-05-10,1100 
3,2012-05-10,10000 

내가 쿼리를 만들 싶습니다을 그 총 플레이어 수, 쿼리가 실행 된 날짜 및 통화 층의 분석을 반환하므로 출력은 항상 다음과 같이 1 행만 표시되어야합니다.

Date: 2012-05-10 
Total Players: 3 
100 - 900 : 1 
999 - 1500 : 1 
9000 - MAX : 1 

커서를 사용하여 계층 수준을 계산하는 방법을 알고 있습니다. 커서없이 계층 수준을 계산하는 방법이 있는지 궁금합니다. SELECT CASE를 사용하려고하면 레코드 당 1 행을 얻게됩니다. 나는 updatedAt에 의해 그룹화를 시도하고 같은 것을 반환합니다. 어떤 도움을 주시면 감사하겠습니다.

SELECT 
'0 - 10000' = COUNT(CASE WHEN CreditBalance >= 0 AND CreditBalance <= 10000 THEN 1 ELSE 0 END), 
'10001 - 20000' = COUNT(CASE WHEN CreditBalance >= 10001 AND CreditBalance <= 20000 THEN 1 ELSE 0 END), 
'20001 - 30000' = COUNT(CASE WHEN CreditBalance >= 20001 AND SUM(CreditBalance) <= 30000 THEN 1 ELSE 0 END), 
'30001 - 60000' = COUNT(CASE WHEN CreditBalance >= 30001 AND SUM(CreditBalance) <= 60000 THEN 1 ELSE 0 END), 
'60001 - 100000' = COUNT(CASE WHEN CreditBalance >= 60001 AND SUM(CreditBalance) <= 100000 THEN 1 ELSE 0 END), 
'100001 - 150000' = COUNT(CASE WHEN CreditBalance >= 100001 AND SUM(CreditBalance) <= 150000 THEN 1 ELSE 0 END), 
'150001 - 200000' = COUNT(CASE WHEN CreditBalance >= 150001 AND SUM(CreditBalance) <= 200000 THEN 1 ELSE 0 END), 
'200001 - 500000' = COUNT(CASE WHEN CreditBalance >= 200001 AND SUM(CreditBalance) <= 500000 THEN 1 ELSE 0 END), 
'500001 - 1000000' = COUNT(CASE WHEN CreditBalance >= 500001 AND SUM(CreditBalance) <= 1000000 THEN 1 ELSE 0 END), 
'1000001 - Max' = COUNT(CASE WHEN CreditBalance >= 1000001 THEN 1 ELSE 0 END), 
CONVERT(DATE,LastUpdateDate) AS [Day], 
SUM(CreditBalance) AS TotalDailyCurrency, 
COUNT(PlayerID) AS DailyActiveUsers, 
AVG(CreditBalance) AS AverageCreditsPerMAU 
FROM dbo.PlayerBalances 
WHERE CONVERT(DATE,LastUpdateDate) = CONVERT(DATE,GETUTCDATE()) 
GROUP BY LastUpdateDate 

그리고 난 점점 오전 : 다음 쿼리와 솔루션 1을 사용

메시지 130, 수준 15, 상태 1, 줄 7 는 집계 또는 하위 쿼리가 포함 된 식에서는 집계 함수를 수행 할 수 없습니다 .

+0

간격 사이의 균형을 유지하면서 사용자를 놓칠 수 있기 때문에 간격이 잘못되었습니다. 나는. '10000.5'. (row1)'<= 10000' 및 (row2)'> 10000' – Johan

답변

1

가 보인다. 최종 해결책은 다음과 같습니다.

SELECT COUNT(CASE WHEN CreditBalance >= 0 
        AND CreditBalance <= 10000 THEN 1 
      END) AS '0-10000' , 
COUNT(CASE WHEN CreditBalance >= 10001 
        AND CreditBalance <= 20000 THEN 1 
      END) AS '10001 - 20000' , 
COUNT(CASE WHEN CreditBalance >= 20001 
        AND CreditBalance <= 30000 THEN 1 
      END) AS '20001 - 30000' , 
COUNT(CASE WHEN CreditBalance >= 30001 
        AND CreditBalance <= 60000 THEN 1 
      END) AS '30001 - 60000' , 
COUNT(CASE WHEN CreditBalance >= 60001 
        AND CreditBalance <= 100000 THEN 1 
      END) AS '60001 - 100000' , 
COUNT(CASE WHEN CreditBalance >= 100001 
        AND CreditBalance <= 150000 THEN 1 
      END) AS '100001 - 150000' , 
COUNT(CASE WHEN CreditBalance >= 150001 
        AND CreditBalance <= 200000 THEN 1 
      END) AS '150001 - 200000' , 
COUNT(CASE WHEN CreditBalance >= 200001 
        AND CreditBalance <= 500000 THEN 1 
      END) AS '200001 - 500000' , 
COUNT(CASE WHEN CreditBalance >= 500001 
        AND CreditBalance <= 1000000 THEN 1 
      END) AS '500001 - 1000000' , 
COUNT(CASE WHEN CreditBalance >= 1000001 THEN 1 
      END) AS '1000001 - MAX' 
FROM dbo.PlayerBalances 
GROUP BY CONVERT(DATE, LastUpdateDate) 
0
SELECT COUNT(CASE WHEN CurrencyBal >= x_1 and CurrencyBal < x_2 THEN 1 ELSE END), 
     COUNT(CASE WHEN CurrencyBal >= x_2 and CurrencyBal < x_3 THEN 1 ELSE END) 
    ...., 
    UpdatedAt, 
    Count(*) 
    FROM Table t 
    WHERE UpdatedAt = <yourdate> 
    GROUP BY UpdatedAt 

또는 테이블 계층에서 계층을 정의하려면 더 나은 방법 (min_range, max_range)

SELECT COUNT(CASE WHEN CurrencyBal >= min_range and CurrencyBal < max_range THEN 1 ELSE END), 
    min_range, 
    UpdatedAt 
    FROM Table t INNER JOIN Tier ti ON CurrencyBal >= min_range and CurrencyBal < max_range 
    WHERE UpdatedAt = <yourdate> 
    GROUP BY min_range,UpdatedAt 
+0

을 사용해보십시오. 해결책 1을 시도하고 위에 게시 한 오류가 있습니다. – SSISPissesMeOff

1

는 또 다른 당신을 위해 바이올린을 얻었다. 당신이 무슨 생각을하는지 제게 알려주세요.

http://sqlfiddle.com/#!3/eed70/2

당신을 위해 다른 대안이 당신이 가지고 첫번째 얼마나 많은 경우에 통보하지 않았다 더 확장 할 수 있습니다. 내가해야 할 일을했을 모든 case 문에서 ELSE 0을 제거처럼

http://sqlfiddle.com/#!3/eed70/4

+0

첫 번째 바이올렛은 결과를 반환하지 않으며 두 번째 바이올렛은 모든 레코드에 대해 한 행을 반환합니다. 쿼리 구문을 사용하면 위의 레벨을 기반으로 모든 머리글 정보를 제거하려는 경우 커서없이 완료 할 수 있습니다. 기본적으로 플레이어가 계층으로 분리 된 모든 날짜에 대해 한 행을 반환합니다. 나는 내가 항상 커서를 사용하는 것으로 돌아갈 수 있다고 생각하지만, 나는 오히려하지 않을 것이라고 생각한다. – SSISPissesMeOff

관련 문제