1

このクエリがあります:

SELECT
  count(*) as Total, 
  SUM(CASE WHEN gender = 1 then 1 ELSE 0 END) Male, 
  SUM(CASE WHEN gender = 2 then 1 ELSE 0 END) Female, 
  SUM(CASE WHEN gender = 0 then 1 ELSE 0 END) Unknown, 
  CASE 
    WHEN age>2 AND age<15 THEN '2-15' 
    WHEN age>18 AND age<25 THEN '18-25' 
  END AS var
FROM
  persons 
WHERE
  1=1 
  AND `date` > '2012-01-10'
  AND `date` < '2013-01-07' 
GROUP BY 
  CASE 
    WHEN age>2 AND age<15 THEN '2-15' 
    WHEN age>18 AND age<25 THEN '18-25'
  END

そして、これが生じています:

Total Male  Female  Unknown var
29     17   12      0       NULL
7      0    7       0       18-25
3      0    3       0       2-15

1 番目の質問:
なぜ NULL になるのですか? 値のある結果のみを表示するにはどうすればよいでしょうか?

2 番目の質問:
mysql は私のvar列を 2-15 の前に 18-25 で並べ替えています。これは、1 番が最初に来てから 2 番が来たためかもしれません。

乾杯 :)

4

3 に答える 3

2

これは、すべてのCASE式に (暗黙のデフォルト)ELSE NULL部分があるためです。SO、または条件ageのいずれにも当てはまらない値は、値がグループ化されます。age>2 AND age<15age>18 AND age<25NULL

WHERE解決策は、句にもう 1 つの制限を追加することです。

WHERE 1=1 
AND `date` > '2012-01-10' AND `date` < '2013-01-07' 
AND ( (age>2 AND age<15) OR (age>18 AND age<25) )        -- this 

2 番目の質問では、関数 on を使用して、 (文字列である) でage行われる比較を回避できます。var

 ORDER BY MIN(age)

あるいは単に:

ORDER BY age 

上記のいずれも SQL 標準によるものではありませんが、デフォルトの非 ANSI 設定で MySQL で機能します。本で100%になりたい場合は、少し変更できますvar

SELECT count(*) as Total, 
  SUM(CASE WHEN gender = 1 then 1 ELSE 0 END) Male, 
  SUM(CASE WHEN gender = 2 then 1 ELSE 0 END) Female, 
  SUM(CASE WHEN gender = 0 then 1 ELSE 0 END) Unknown, 
  CASE 
    WHEN age>2 AND age<15 THEN '02-15'                    -- this was changed
    WHEN age>18 AND age<25 THEN '18-25' 
  END AS var
FROM persons 
WHERE 1=1 
  AND `date` > '2012-01-10' AND `date` < '2013-01-07' 
  AND ( (age>2 AND age<15) OR (age>18 AND age<25) )
GROUP BY 
  CASE 
     WHEN age>2 AND age<15 THEN '02-15' 
     WHEN age>18 AND age<25 THEN '18-25' 
  END
ORDER BY var ;
于 2013-01-07T19:06:57.423 に答える
2

1 番目の回答:
年齢の CASE 条件のいずれも満たさないため、NULL です。次のように WHERE に句を追加すると、次のようになります。

WHERE (age > 2 AND age < 15) OR (age > 18 AND age < 25)

2番目の答え
あなたは正しいです。文字列で並べ替えています(それが文字列であるため)。ORDER ASCまたはを実行して、並べ替えの方向を変更するだけですORDER DESC

于 2013-01-07T19:07:06.560 に答える
1

あなたは得ていますNULL

それはあなたのCASEを満たしていないからです

 CASE 
WHEN age>2 AND age<15 THEN '2-15'    // U HAVE BETWEEN 2-15
WHEN age>18 AND age<25 THEN '18-25'   // u have between 18-25

   // but u dont have between 15-18 
   //and u get null because your value is between 15-18 

その範囲で他のケースを追加してみてください。

2 番目の質問は、数値ではなく文字列であるためです。

年代順に並べてみてください

于 2013-01-07T20:17:32.647 に答える