2017-06-15 10 views
1

私は本当にこの問題の答えを見つけるのに苦労しています。別の列の値を変更するif文またはcase文を記述したいとします。 'check'列が0の場合、 'points'列も0になります。SQLのIF/CASE文

SELECT club_name, COALESCE(club_winner,0) AS 'check', COUNT(*) AS points, 
    CASE 
    WHEN check = '0' 
    THEN points = '0' 
    ELSE check 
    END as Saleable 
    FROM clubs c 
    LEFT JOIN club_results cr ON c.club_id = cr.club_winner 
    GROUP BY club_name ORDER BY points DESC 
+1

を "WHENチェック= '0' のポイントとしてTHEN '0' ELSEポイントEND"? –

+0

テーブルで更新したいのですか、それとも単に表示しますか? –

+0

これはMySQLかTransact-SQLですか? – Black

答えて

3

ケースステートメントで列を「SET」できません。値を返すことができます。 case文は可変列と考えることができます。 '0'を返すAS Saleable(または名前を付ける列)。

SELECT club_name, COALESCE(club_winner,0) AS 'check', COUNT(*) AS points, 
CASE 
WHEN COALESCE(club_winner,0) = 0 
THEN 0 
ELSE COUNT(*) 
END AS points_or_0_if_check_is_0 
FROM clubs c 
LEFT JOIN club_results cr ON c.club_id = cr.club_winner 
GROUP BY club_name ORDER BY points_or_0_if_check_is_0 DESC 
+1

後でselect句で以前の列別名を再利用することはできません。 – Donnie

+0

おっと、@Donnie。思考チェックは普通の列でした(上記には逃しました) – FrankerZ

+0

また、 'points'エイリアスです。 – Donnie

0

あなたはあなたのままにそうように参加一致する行のみをカウントするように選択することができます:あなたが意味するか

SELECT 
    club_name, 
    COUNT(
     CASE WHEN 
      club_winner IS NOT NULL 
     THEN 
      CR.id 
     ELSE 
      NULL 
     END 
    ) AS `points` 
FROM 
    clubs C 
LEFT JOIN 
    club_results CR ON C.club_id = CR.club_winner 
GROUP BY 
    C.club_id 
ORDER BY 
    points DESC