2012-02-06 4 views
0

мне нужно подсчитать общее количество «звезд» от общего числа на пользователь STARS в пределах следующих значенийГрафы количества звезд в пределах диапазона значений

DATABASE: MS SQL 2008 R2

STARAMOUNT1 = STAR score < 1.4 

STARAMOUNT2 = STAR score BETWEEN 1.5 AND 2.4 

STARAMOUNT3 = STAR score BETWEEN 2.5 AND 3.4 

STARAMOUNT4 = STAR score BETWEEN 3.5 AND 4.4 

STARAMOUNT5 = STAR score BETWEEN 4.5 AND 5.0 

Начальные SQL, что дает насчитайте звезд одного пользователя:

SELECT Cast(Cast(Round(AVG(Cast(b.stars AS Float)),1) 
AS Numeric(25,1)) AS VarChar(25)) AS 'Stars' 
    FROM score b 
     JOIN game_users a ON a.id = b.game_users_id 
     GROUP BY a.username, a.current_state  

Я тогда нужно сделать подсчет в вышеуказанных criíterias от количества пользователей, имеет такое количество насчитайте звезд

Может кто-нибудь мне помочь? :-)

С наилучшими пожеланиями

Стиг :-)

ответ

1

Это должно сделать это, хотя я изменил часть вашего первоначального запроса, чтобы соответствовать тому, что вы спрашивали:

;WITH UserStars AS 
(
    SELECT a.username, ROUND(AVG(CAST(b.stars AS FLOAT)),1) Stars 
    FROM score b 
    JOIN game_users a ON a.id = b.game_users_id 
    GROUP BY a.username 
) 
SELECT CASE WHEN Stars < 1.4 THEN 'StarAmount1' 
     WHEN Stars BETWEEN 1.4 AND 2.4 THEN 'StarAmount2' 
     WHEN Stars BETWEEN 2.4 AND 3.4 THEN 'StarAmount3' 
     WHEN Stars BETWEEN 3.4 AND 4.4 THEN 'StarAmount4' 
     WHEN Stars BETWEEN 4.4 AND 5.0 THEN 'StarAmount5' ELSE 'AnotherStarAmount' END StarAmount, 
     COUNT(*) Users 
FROM UserStars 
GROUP BY CASE WHEN Stars < 1.4 THEN 'StarAmount1' 
     WHEN Stars BETWEEN 1.4 AND 2.4 THEN 'StarAmount2' 
     WHEN Stars BETWEEN 2.4 AND 3.4 THEN 'StarAmount3' 
     WHEN Stars BETWEEN 3.4 AND 4.4 THEN 'StarAmount4' 
     WHEN Stars BETWEEN 4.4 AND 5.0 THEN 'StarAmount5' ELSE 'AnotherStarAmount' END 
+0

Hi Lamak .. Wauw, я не был в курсе, что SQL-запрос может быть сделан таким образом. Я потратил весь день на то, чтобы найти решение для этого, несколькими способами, но я не приблизился к этому ни в одном из моих исследований. Работа блестяще, спасибо большое :-) – Stkol76

+0

@ Stkol76 - Рад, что это сработало – Lamak

0

Вот один из способов, есть, конечно, другие.

SELECT 
    u.username, u.current_state, 
    STARAMOUNT1 = SUM(CASE WHEN s.score < 1.4 THEN 1 ELSE 0 END), 
    STARAMOUNT2 = SUM(CASE WHEN s.score BETWEEN 1.5 AND 2.4 THEN 1 ELSE 0 END), 
    STARAMOUNT3 = SUM(CASE WHEN s.score BETWEEN 2.5 AND 3.4 THEN 1 ELSE 0 END), 
    STARAMOUNT4 = SUM(CASE WHEN s.score BETWEEN 3.5 AND 4.4 THEN 1 ELSE 0 END), 
    STARAMOUNT5 = SUM(CASE WHEN s.score > 4.5 THEN 1 ELSE 0 END) 
FROM dbo.score AS s 
INNER JOIN dbo.game_users AS u 
ON u.id = s.game_users_id 
GROUP BY u.username, u.current_state; 
Смежные вопросы