0

次のようなクエリがあります。

select 
price, 
item_id,
sum(price),
count(item_id)
from transactions
group by
(price <= 20),
(price between 21 and 30),
(price between 31 and 40),
(price between 41 and 50),
(price > 50)

私がこれを書いたとき、このようなグループを作成したことはありませんでしたが、クエリが有効かどうかを推測していましたが、有効でした。しかし、私の質問は、本当に私が欲しいものを手に入れているのでしょうか?

すべてのトランザクションを次のようにグループ化します。

  • 20ドル以下の商品
  • 21 ドルから 30 ドルの商品
  • 31 ドルから 40 ドルの商品
  • 41 ドルから 50 ドルの商品
  • 50ドル以上の商品

それで、そのクエリは私が求めていることをしていますか?

4

3 に答える 3

1

標準 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
于 2013-02-24T16:17:26.900 に答える
1
SELECT 
  price, 
  item_id,
  sum(price),
  count(item_id),
  IF(price<=20,0,IF(price<=30,1,IF(price<=40,2,IF(price<=50,3,4)))) AS pricegroup
FROM transactions
GROUP BY pricegroup

あるいは

SELECT 
  price, 
  item_id,
  sum(price),
  count(item_id)
FROM transactions
GROUP BY 
  IF(price<=20,0,IF(price<=30,1,IF(price<=40,2,IF(price<=50,3,4))))
于 2013-02-24T16:12:51.580 に答える
0
SELECT  price, 
        item_id,
        SUM(CASE WHEN price <= 20 THEN price ELSE 0 END) `(price <= 20) SUM`,
        SUM(CASE WHEN price <= 20 THEN 1 ELSE 0 END) `(price <= 20) COUNT`,
        SUM(CASE WHEN price between 21 and 30 THEN price ELSE 0 END) `(price <= 20) SUM`,
        SUM(CASE WHEN price between 21 and 30 THEN 1 ELSE 0 END) `(price <= 20) COUNT`,
        SUM(CASE WHEN price between 31 and 40 THEN price ELSE 0 END) `price between 31 and 40 SUM`,
        SUM(CASE WHEN price between 31 and 40 THEN 1 ELSE 0 END) `price between 31 and 40 COUNT`,
        SUM(CASE WHEN price between 41 and 50 THEN price ELSE 0 END) `price between 41 and 50 SUM`,
        SUM(CASE WHEN price between 41 and 50 THEN 1 ELSE 0 END) `price between 41 and 50 COUNT`,
        SUM(CASE WHEN price > 50 THEN price ELSE 0 END) `price > 50 SUM`,
        SUM(CASE WHEN price > 50 THEN 1 ELSE 0 END) `price > 50 COUNT`
FROM    transactions
GROUP   BY price, item_id
于 2013-02-24T16:15:41.317 に答える