这是我的数据
|vendorname |total|
---------------------
|Najla |10 |
|Disney |20 |
|Disney |10 |
|ToysRus |5 |
|ToysRus |1 |
|Gap |1 |
|Gap |2 |
|Gap |3 |
|Najla |2 |
这是我想要的结果集
|vendorname |grandtotal|
---------------------
|Disney |30 |
|Gap |6 |
|ToysRus |6 |
|Najla |2 |
|Najla |10 |
如果vendorname ='Najla',我想要各自的行与其各自的总数,否则我想将它们分组并返回它们的总和。
这是我的查询 -
select *
from
(
select vendorname, sum(total) grandtotal
from vendor
where vendorname<>'Najla'
group by vendorname
union all
select vendorname, total grandtotal
from vendor
where vendorname='Najla'
) A
我想知道是否有更好的方法来编写此查询,而不是重复两次并执行联合。是否有一种浓缩方式可以“有条件地”对某些行进行分组。
答案 0 :(得分:6)
老实说,如果它具有适当的索引,我认为union all
版本将是性能最佳且最容易阅读的选项。
但是,你可以这样做(假设你的桌子上有一个独特的id
):
select vendorname, sum(total) grandtotal
from t
group by
vendorname
, case when vendorname = 'Najla' then id else null end
rextester演示:http://rextester.com/OGZQ33364
返回
+------------+------------+
| vendorname | grandtotal |
+------------+------------+
| Disney | 30 |
| Gap | 6 |
| ToysRus | 6 |
| Najla | 10 |
| Najla | 2 |
+------------+------------+