0

次のクエリを継承しました。このクエリは、指定された「トライ」(ラグビー用語でタッチダウン) の平均評価を取得します。うまくいけば、私たちはまだそれを扱うことができます。

SELECT i.id, i.title,
        (
            CASE
                WHEN
                    COUNT( r.rating ) > 0
                THEN
                    (
                        SUM( r.rating ) / COUNT( r.rating )
                    )
                ELSE
                    0
            END
        ) AS rating,

        COALESCE( er.id, 0 ) AS has_existing_rating
    FROM
        (
            SELECT 1 AS id, 'Try 1 – Israel Dagg v Chiefs.' as title UNION ALL
            SELECT 2 AS id, 'Try 2 – Israel Dagg v Chiefs.' as title UNION ALL
            SELECT 3 AS id, 'Try 3 – Leilia Masaga v Crusaders.' as title UNION ALL
            SELECT 4 AS id, 'Try 4 – Israel Dagg v Chiefs.' as title UNION ALL
            SELECT 5 AS id, 'Try 5 – Fred Flintstone v Hurricanes.' as title UNION ALL
            SELECT 6 AS id, 'Try 6 – Israel Dagg v Chiefs.' as title UNION ALL
            SELECT 7 AS id, 'Try 7 – Israel Dagg v Chiefs.' as title
        ) AS i

    LEFT OUTER JOIN
        tryPoll r
    ON
        i.id = r.try_id

    <!--
        Join this to the rating table AGAIN to see if the current
        user has already rated the given try.
    -->
    LEFT OUTER JOIN
        tryPoll er
    ON
        (
                er.try_id = i.id
            AND
                er.ip_address = '#cgi.remote_addr#'
            AND
                er.user_agent = '#cgi.http_user_agent#'
        )

    GROUP BY
        i.id,
        r.try_id,
        er.id,
        i.title
    ORDER BY
        i.id ASC

したがって、次の表を考えると (この場合、評価 = 1 は単純に 1 票を意味します) ....

tryPoll

 id     try_id     rating     ip_address     user_agent
    ------------------------------------------------------
    1      2          1          58.28.220.51   Mozilla/5.0 blah
    2      2          1          58.28.220.52   Mozilla/5.0 blah
    3      6          1          58.28.220.53   Mozilla/5.0 blah
    4      4          1          58.28.220.54   Mozilla/5.0 blah

...クエリは、try_id #2 に対して (1 + 1) / 2 = 1 の平均評価を返します

ただし、このクエリを調整して、すべての試行に対する評価よりも特定の試行に対する評価のパーセンテージを返す必要があります。つまり、上記の例では、すべての試行に対するすべての評価の何パーセントが try_id #2 に起因するかを判断します。

どうすればこれを達成できますか?

4

1 に答える 1

1

この解決策を試すことができます:

DECLARE @try_id INT;
SET @try_id=2;

SELECT  r.try_id,
        SUM(r.rating) AS ratings_per_try,
        SUM(SUM(r.rating)) OVER() AS ratings_overall,
        SUM(r.rating)*1.0 / NULLIF(SUM(SUM(r.rating)) OVER(), 0) AS percent_try     
FROM    Table r
GROUP BY r.try_id
于 2013-07-31T14:17:35.933 に答える