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
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 回答
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 分组吗?或者您只是想退回一件任意物品?根据您的需要,我item_idselect子句中删除了。似乎没有必要。

您的查询实际上确实在 MySQL 中运行,就其运行而言。它将为您想要的每个组生成一行,因此从这个意义上说它“有效”。但是,在每个组中,它将选择任意价格和 item_id。这些在group by子句中没有明确提及,因此您使用的是名为 Hidden Columns 的 MySQL(错误)功能。查询的不同运行或对数据的细微更改或对查询的细微更改可能会更改为每个组返回的 price 和 item_id 的值。

我强烈建议您实际命名该组。这使得查询和输出更加清晰。

另外,我建议您养成将所有列都放在子句中的select习惯group 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 回答
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 回答