【问题标题】:Better way of writing my SQL query with conditional group by用条件组编写我的 SQL 查询的更好方法
【发布时间】: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 而不是unionunion 没有 all 将删除重复项,如果您有两行 'Najla' 具有相同的 total,这将很糟糕。
  • 好点!谢谢。
  • 第二,如果你在列vendorname(最好是vendorID)上有一个索引,你不会读表两次,只读一次
  • 你的方法(union all)可能是最好的方法。

标签: sql sql-server group-by


【解决方案1】:

老实说,如果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 |
+------------+------------+

【讨论】:

  • 谢谢。这很有帮助。
  • @NajlaAugust 乐于助人!
猜你喜欢
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多