1

このクエリを正しく注文できるようにするのに苦労してstakesいます-descでもascでもない値を返します。winsorder by を使用すると動作します。おそらく、MySQL は集計を作成するときにソート順を評価しなかったのでしょうか?

読みにくくするために、フルネームの一部を削除しました。

SELECT a.b AS  t , COUNT(  c.aID ) AS  r , 
                   COUNT( 
                          CASE WHEN  c.Finish =1
                               THEN 1 
                               ELSE NULL 
                               END )               AS  wins , 
                 CONCAT( FORMAT( (
                                   COUNT( 
                                          CASE WHEN  c.Finish =1
                                               THEN 1 
                                               ELSE NULL 
                                               END ) / COUNT(  c.aID ) ) *100, 0 ) ,  '%'
                       ) AS  Percent , 
                FORMAT( SUM(  c.StakeWon ) , 0 ) AS  stakes 
 FROM c
 INNER JOIN a ON c.aID = a.aID
 INNER JOIN d ON c.dID = d.dID
 WHERE  d.w >= STR_TO_DATE(  '2012,07,01',  '%Y,%m,%d' ) 
 AND  d.w < STR_TO_DATE(  '2012,07,01',  '%Y,%m,%d' ) + INTERVAL 1 
 MONTH 
 GROUP BY  a.b 
 ORDER BY  stakes DESC`

で注文しても機能しませんPercent。ここでこの質問をしたくありませんでしたが、これは私を夢中にさせています。

4

2 に答える 2

2

結果の一部を表示すると役に立ちますが、書式を設定する前に賭け金を並べ替える必要があります。次に、書式設定された文字列ではなく、数値を実際に並べ替えます。

SQL Fiddleの例を次に示します。

フォーマットのため、数値は降順でソートされません

100
10,000,000
-5,000,005

だからあなたは次のようなことをするでしょう

...
     FORMAT( SUM(  c.StakeWon ) , 0 ) AS  stakes ,
     SUM(  c.StakeWon )  AS  stakes_num 
...
     ORDER BY stakes_num desc

例: SQL Fiddle

于 2012-09-29T10:27:59.783 に答える
0

この表現全体を使ってみてください

COUNT(  c.aID ) AS  r , 
                   COUNT( 
                          CASE WHEN  c.Finish =1
                               THEN 1 
                               ELSE NULL 
                               END )               AS  wins , 
                 CONCAT( FORMAT( (
                                   COUNT( 
                                          CASE WHEN  c.Finish =1
                                               THEN 1 
                                               ELSE NULL 
                                               END ) / COUNT(  c.aID ) ) *100, 0 ) ,  '%'
                       ) AS  Percent , 
                FORMAT( SUM(  c.StakeWon ) , 0 )

エイリアスの代わりに order by 句で。私の観察では、Alias はこのようには機能しません

多分こんな感じ

SELECT a.b AS  t , COUNT(  c.aID ) AS  r , 
                   COUNT( 
                          CASE WHEN  c.Finish =1
                               THEN 1 
                               ELSE NULL 
                               END )               AS  wins , 
                 CONCAT( FORMAT( (
                                   COUNT( 
                                          CASE WHEN  c.Finish =1
                                               THEN 1 
                                               ELSE NULL 
                                               END ) / COUNT(  c.aID ) ) *100, 0 ) ,  '%'
                       ) AS  Percent , 
                FORMAT( SUM(  c.StakeWon ) , 0 ) AS  stakes 
 FROM c
 INNER JOIN a ON c.aID = a.aID
 INNER JOIN d ON c.dID = d.dID
 WHERE  d.w >= STR_TO_DATE(  '2012,07,01',  '%Y,%m,%d' ) 
 AND  d.w < STR_TO_DATE(  '2012,07,01',  '%Y,%m,%d' ) + INTERVAL 1 
 MONTH 
 GROUP BY  a.b 
 ORDER BY  COUNT(  c.aID ) AS  r , 
                   COUNT( 
                          CASE WHEN  c.Finish =1
                               THEN 1 
                               ELSE NULL 
                               END )               AS  wins , 
                 CONCAT( FORMAT( (
                                   COUNT( 
                                          CASE WHEN  c.Finish =1
                                               THEN 1 
                                               ELSE NULL 
                                               END ) / COUNT(  c.aID ) ) *100, 0 ) ,  '%'
                       ) AS  Percent , 
                FORMAT( SUM(  c.StakeWon ) , 0 ) DESC`
于 2012-09-29T10:22:58.053 に答える