0

問題があります。SQL クエリで IF ステートメントを使用しようとしていますが、このステートメントの結果をさらに計算に使用します。

SELECT average_rating, number_of_ratings,    
    IF(number_of_ratings < 500 AND number_of_ratings > 100, 0.90, 
        IF(number_of_ratings>=500 AND number_of_ratings<=1000, 0.95, 
            IF(number_of_ratings>1000, 0.99, 0.80)
        )
    ) AS rating_factor,    
    ROUND((rating_factor * average_rating), 4) AS factored_rating    
FROM table
ORDER by factored_rating DESC

ただし、それは機能せず、エラーを返します: 「フィールド リスト」の不明な列「rating_factor」

誰かがそれを機能させる方法を知っていますか?

前もって感謝します。

4

3 に答える 3

3

rating_factor 列と factored_rating 列の両方が必要ない場合、Alain のクエリは機能します。njk のクエリはサブクエリの ANSI 準拠バージョンです。

ただし、MySQLを使用しているため、一時変数を使用して値を格納できます。IF条件も簡略化しました。

SELECT
    average_rating,
    number_of_ratings,
    @x := IF(number_of_ratings> 1000, 0.99,
          IF(number_of_ratings>=500 , 0.95,
          IF(number_of_ratings> 100 , 0.90,
                                      0.80))) rating_factor,
    ROUND((@x * average_rating), 4) AS factored_rating
FROM mytable
ORDER by factored_rating DESC

このクエリを表示するSQLFiddleを次に示します。
後世のために、サンプルを以下に複製します。

drop table if exists mytable;
create table mytable (
average_rating int,
number_of_ratings int,
factored_rating int);
insert into mytable
select 5,2,3 union all
select 4,1,5 union all
select 12,3,1 union all
select 11,4,2 union all
select 8,2,12;

クエリの結果

"average_rating";"number_of_ratings";"rating_factor";"factored_rating"
"12";"3";"0.80";"9.6000"
"11";"4";"0.80";"8.8000"
"8";"2";"0.80";"6.4000"
"5";"2";"0.80";"4.0000"
"4";"1";"0.80";"3.2000"
于 2012-09-18T20:39:02.103 に答える
1

これは役立つはずです:

SELECT a.average_rating, a.number_of_ratings, ROUND((a.rating_factor * a.average_rating), 4) AS factored_rating
FROM
    (SELECT average_rating, number_of_ratings,    
        IF(number_of_ratings < 500 AND number_of_ratings > 100, 0.90, 
            IF(number_of_ratings>=500 AND number_of_ratings<=1000, 0.95, 
                IF(number_of_ratings>1000, 0.99, 0.80)
            )
        ) AS rating_factor   
    FROM table
    ORDER by factored_rating DESC) a
于 2012-09-18T20:24:39.600 に答える
1

IF数式でステートメントの結果を使用します。私は括弧を正しく持っていると思いますが、アイデアを見る必要があります:

SELECT average_rating, number_of_ratings,    
  ROUND((
    IF(number_of_ratings < 500 AND number_of_ratings > 100, 0.90, 
        IF(number_of_ratings>=500 AND number_of_ratings<=1000, 0.95, 
            IF(number_of_ratings>1000, 0.99, 0.80)
        )
    ) * average_rating), 4) as factored_rating    
FROM table
ORDER by factored_rating DESC
于 2012-09-18T20:26:22.613 に答える