【发布时间】:2017-03-16 19:35:19
【问题描述】:
这是我的数据
|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
我想知道是否有更好的方法来编写此查询,而不是重复两次并执行联合。是否有一种简洁的方法可以“有条件地”对某些行进行分组。
【问题讨论】:
-
首先,您应该使用
union all而不是union。union没有all将删除重复项,如果您有两行 'Najla' 具有相同的total,这将很糟糕。 -
好点!谢谢。
-
第二,如果你在列
vendorname(最好是vendorID)上有一个索引,你不会读表两次,只读一次 -
你的方法(
union all)可能是最好的方法。
标签: sql sql-server group-by