时间:2017-03-16 19:35:19

标签: sql sql-server group-by

这是我的数据

|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

我想知道是否有更好的方法来编写此查询,而不是重复两次并执行联合。是否有一种浓缩方式可以“有条件地”对某些行进行分组。

1 个答案:

答案 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 |
+------------+------------+