2017-07-06 3 views
0

私のSQLクエリは、 'order by'句を追加するまでうまく動作します。 「式でグループではありません」というエラーが表示されました 「select」句に正確な列のコピーを置くことになっていたと思いますが、その列の順序を編集する場合は「order by」句あなたのテーブルに...私の注文はセクション別に 'グループではありません'というエラーを返します

select 
case when latitude between -18 and 18 then 'tropical' 
when latitude between -36 and 36 then 'subtropical' 
when latitude between -54 and 54 then 'average' 
when latitude between -72 and 72 then 'subpolar' 
else 'polar' end klimaat, 
count(1) 
from regios 
WHERE latitude is not null and niveau=0 
group by case when latitude between -18 and 18 then 'tropical' 
when latitude between -36 and 36 then 'subtropical' 
when latitude between -54 and 54 then 'average' 
when latitude between -72 and 72 then 'subpolar' 
else 'polar' end 
order by case when latitude between -18 and 18 then 5 
when latitude between -36 and 36 then 4 
when latitude between -54 and 54 then 3 
when latitude between -72 and 72 then 2 
else 1 end 

編集:明確にするためには、私は必ずしもこの問題ではなく、コードのこの特定の部分は、基本的に

+1

なぜ単純にしていないのですか?abs(latitude)による注文asc?私には同じ結果が出るようです。 –

+0

また、私はmysqlがグループのエイリアスを使うことができると思います:select ... group by klimaat order by klimaat –

+0

私は必ずしもこの問題の解決策を探しているわけではありませんが、 –

答えて

0

機能しない理由の説明を解決するために見ているわけではありません、 CASE では1つの列のみを作成します。順序では、通常は列のみを名前で指定できますが、番号(選択リストの列の位置)を使用できます。

私はMySQLでテストをした

select 
case when latitude between -18 and 18 then 'tropical' 
when latitude between -36 and 36 then 'subtropical' 
when latitude between -54 and 54 then 'average' 
when latitude between -72 and 72 then 'subpolar' 
else 'polar' end klimaat, 
count(1) 
from regios 
WHERE latitude is not null and niveau=0 
group by case when latitude between -18 and 18 then 'tropical' 
when latitude between -36 and 36 then 'subtropical' 
when latitude between -54 and 54 then 'average' 
when latitude between -72 and 72 then 'subpolar' 
else 'polar' end 
order by 1; 

をお試しください:

:これはあまりにも

select 
case when latitude between -18 and 18 then 'tropical' 
when latitude between -36 and 36 then 'subtropical' 
when latitude between -54 and 54 then 'average' 
when latitude between -72 and 72 then 'subpolar' 
else 'polar' end klimaat, 
count(1) AS RC 
from regios 
WHERE latitude is not null 
group by klimaat 
order by klimaat; 

サンプル・データ(semplicityのために、私はちょうどあなたとniveau = 0を削除)働くようです

create table regios (latitude integer, test varchar(100)); 
insert into regios value (15, 'aaa'); 
insert into regios value (37, 'bbb'); 
insert into regios value (55, 'ccc'); 
insert into regios value (84, 'ddd'); 

出力:

klimaat RC 
1 average 1 
2 polar 1 
3 subpolar 1 
4 tropical 1 

次回にテーブルを作成するスクリプト、サンプルデータ、および得られた期待される結果(テキスト形式)を使用すると、SOのすべてのメンバーがあなたをより迅速に、より迅速に支援できます。

+0

意図的な注文はしません。私はなぜコードがうまくいかないのか解説を探していますが、解決策ではなく、簡単な説明のために更新を見てください。 –

+0

何を注文しますか? (StackOverflowで提案されているように)サンプルデータ、期待される結果などを投稿すると助けが簡単になるでしょう。 – etsa

+0

私はここでは推測していますが、式でグループ化しても、終了節が正確な場合は2番目です。あなたの選択した式とは異なる式。最近のバージョンのmysqlでは、デフォルトでは、group byおよびcolumnの選択が同じでなければならない(またはmin/maxなどのグループ化機能を使用する)ことが強制されています。そう、それはエラーを与えているかもしれません。 –

0

集計関数内でカプセル化されていない式は、GROUP BY句に含める必要があります。集計関数内でカプセル化された式のみをorder byで使用できます。

例では、カプセル化されていない列(klimaat)で評価される式は、ORDER BY句で使用される列と異なります。ORDER BYでMAX(緯度)を使用すると、これは集合関数内にカプセル化されています。

関連する問題