1

MYSQL で作業しているクエリの次の部分があります。

SELECT
  MAX(CAST(MatchPlayerBatting.BatRuns AS SIGNED)) AS HighestScore
FROM
  MatchPlayerBatting

正しい結果を返します。ただし、別の列が必要です。

つまり、見つかった最大値が「BatHowOut」内に「not out」の値を持っている場合、96 ではなく、たとえば 96* のように結果を表示する必要があります。

これはどのように行うことができますか?

データを具体的にするために、次の 2 つのケースを検討してください。

BatRuns   BatHowOut
    96    not out
    96    lbw

BatRuns   BatHowOut
    96    not out
   102    lbw

最初のデータの場合、答えは次のようになり'96*'ます。2 番目の'102'.

4

2 に答える 2

0

スコアを降順に並べ替えて、最初のレコードのみを選択するのはどうですか?

select concat(BatRuns , case when BatHowOut = 'not out' then '*' else '' end)
  from mytable
order by cast(BatRuns as signed) desc,
        (case when BatHowOut = 'not out' then 1 else 2 end)
limit 1;

サンプルはこちら

各プレーヤーの最高得点を見つけたい場合は、洗練されていないかもしれませんが、非常に効果的なソリューションを次に示します。

select PlayerID,
       case when runs != round(runs)
                 then concat(round(runs),'*')
            else
                 round(runs)
       end highest_score
  from (select PlayerID,
               max(cast(BatRuns as decimal) + 
                   case when BatHowOut = 'not out' then 0.1 else 0 end
                  ) runs
          from MatchPlayerBatting
         group by PlayerID) max_runs;

これは、実行が分数になることはなく、整数のみになるという事実を利用しています。最高得点が同点でそのうちの 1 人が無敗の場合、無敗得点に 0.1 を加えたものが最高点となります。これは後で削除して * で連結できます。

サンプルはこちら

于 2013-08-20T05:18:52.277 に答える