对SQL查询中的数据进行累计和分组

时间:2014-03-04 01:28:18

标签: mysql sql

我有一个查询,它会按照导入/导出属性的顺序显示产品列表。

select i.`itemid`, p.`prodid`,
(
   (case when p.`desc` like "Import/Export" 
        then 100 else 0 end) +
   (case when p.`desc` like "Export"  
        then 70 else 0 end) +
   (case when p.`desc` like "Import"
        then 50 else 0 end)
) as priority
from item i , product p
where (
    p.`name` LIKE "cleaning agent" 
    and p.`prodid` = i.`itemid`
)

查询在为每个产品添加“优先级”值时没有问题,但我想问的是如何按ID对它们进行分组并根据ID对优先级进行总计?我可以使用Order by关键字对类似的prodid行进行分组,但它只为我提供了一个优先级字段的值。

我想要实现的是对所有类似的产品ID进行分组,并获得其总优先级值。我以前在select语句中使用了sum(),但是我在试图弄清楚如何获取所有优先级字段的总数时感到茫然,因为它是一个查询生成的列。

+--------+----------+
| prodid | priority |
+--------+----------+
| 225    | 50       |
| 225    | 20       |
+--------+----------+

应该是

+--------+----------+
| prodid | priority |
+--------+----------+
| 225    | 70       |
+--------+----------+

这是一个sqlfiddle:http://sqlfiddle.com/#!2/cec136/5

1 个答案:

答案 0 :(得分:1)

您可以使用group by将查询转换为聚合来执行此操作:

select p.`prodid`,
       sum(case when p.`desc` like 'Import/Export' then 100
                when p.`desc` like 'Export' then 70 
                when p.`desc` like 'Import' then 50
                else 20
            end) as priority
from item i join
     product p
     on p.`prodid` = i.`prodid`
where p.`type` LIKE 'cleaning agent'
group by p.prodid;

一路上,我修了几件事:

  • join现在在from子句中是显式的,而不是隐含在where子句中。
  • 由于i.prodid = p.prodid,因此无需在select
  • 中同时包含这两者
  • 我将case语句更改为级联。只有一个条件可以匹配,因此没有理由将各个内容添加到一起。
  • 我将所有字符串常量更改为使用单引号而不是双引号。