標準 SQL (および MySQL) でこれを行う方法は、case
ステートメントを使用することです。また、定義を次のようにサブクエリに入れます。
select pricegrp, sum(price), count(item_id)
from (select t.*,
(case when price <= 20 then '00-20'
when price between 21 and 30 then '21-30'
when price between 31 and 40 then '31-40'
when price between 41 and 50 then '41-50'
when price > 50 then '50+'
end) as pricegrp
from transactions t
) t
group by pricegrp
また、item_id でグループ化しますか? それとも、任意のアイテムを 1 つ返そうとしているだけですか? あなたが望むものに基づいて、節item_id
からを削除します。select
必要ないようです。
実行されるという意味で、クエリは実際に MySQL で機能します。必要なグループごとに 1 つの行を生成するため、その意味では「機能」します。ただし、各グループ内では、任意の価格と item_id を選択します。これらは句で明示的に言及されていないgroup by
ため、隠し列と呼ばれるMySQLの(誤った)機能を使用しています。さまざまなクエリの実行、データへのわずかな変更、またはクエリへのわずかな変更により、各グループに対して返される price と item_id の値が変わる可能性があります。
実際にグループに名前を付けることを強くお勧めします。これにより、クエリと出力がより明確になります。
select
また、すべての列をingroup by
句に入れる習慣を身に付けることをお勧めします。非表示の列が実際に役立つ場合もいくつかありますが、一般的には、非表示の列に依存するのは控えめにすべきだと思います。
価格が整数として格納されていない場合、正しいロジックは次のとおりです。
select pricegrp, sum(price), count(item_id)
from (select t.*,
(case when price <= 20 then '00-20'
when price <= 30 then '21-30'
when price <= 40 then '31-40'
when price <= 50 then '41-50'
when price > 50 then '50+'
end) as pricegrp
from transactions t
) t
group by pricegrp