我有一个查询,它会按照导入/导出属性的顺序显示产品列表。
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
答案 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
语句更改为级联。只有一个条件可以匹配,因此没有理由将各个内容添加到一起。