【问题标题】:How to do a Sum() with condition?如何在条件下进行 Sum()?
【发布时间】:2015-12-20 06:26:18
【问题描述】:

我有一张这样的桌子

+----+------+-----+
| ID | Type | Qty |
+----+------+-----+
| 1  | 1    | 10  |
| 2  | 1    | 10  |
| 3  | 2    | 15  |
| 4  | 1    | 20  |
| 5  | 2    | 10  |
+----+------+-----+

如何根据条件“类型”字段进行动态求和。

类似这样的:

SELECT 
    Type, 
    CASE WHEN Type = 1 THEN SUM(Qty) 
         ELSE Qty 
    END AS SumQty
FROM tbl
GROUP BY ?? 

我想要这样的结果:

+------+--------+
| Type | SumQty |
+------+--------+
| 1    | 40     |
| 2    | 15     |
| 2    | 10     |
+------+--------+

我知道我可以使用 UNION 子句来做到这一点。但是,如果您知道实现该结果的动态查询,请告诉我。 任何解决方案将不胜感激。谢谢

【问题讨论】:

  • 动态查询只是在运行时构建的,而不是预先知道的。它与包含联合子句的查询不互斥。

标签: dynamic sql-server-2012 sum grouping case-when


【解决方案1】:

您可以执行两个查询,一个针对您想要的类型,一个针对所有其他查询,然后将它们合并在一起,例如:

select type, sum(qty) as sumqty from tbl where type = 1 group by type
union all
select type, qty as sumqty from tbl where type <> 1

sqlfiddle 中测试:

create table tbl (id int, type int, qty int);
insert into tbl (id, type, qty) values (1, 1, 10);
insert into tbl (id, type, qty) values (2, 1, 10);
insert into tbl (id, type, qty) values (3, 2, 15);
insert into tbl (id, type, qty) values (4, 1, 20);
insert into tbl (id, type, qty) values (5, 2, 10);
===
select type, sum(qty) as sumqty from tbl where type = 1 group by type
union all
select type, qty as sumqty from tbl where type <> 1

给你你想要的:

type    sumqty
----    ------
   1        40
   2        15
   2        10

【讨论】:

  • 我知道我可以使用 UNION 子句来做到这一点。但是如果不使用 UNION 子句怎么办?
  • @user3867892,我的建议是使用联合,而不是因为一些人为限制而试图寻找另一种方式。这确实是最简单的方法。当然,如果您有正当的限制理由,请随时告诉我们,以便我们调整方法。
  • 是的原因,因为我有大量的查询,我不能使用 UNION 来执行相同的查询,尽管条件不同。
  • @user3867892:在这种情况下,您可以根据您所做和不希望聚合的值动态构建查询(使用innot in,如果它比简单的相等/不等式或两范围检查)。这将包含 union 子句,然后您运行动态生成的查询。正如我在对该问题的评论中所说,它们并不相互排斥。
猜你喜欢
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
相关资源
最近更新 更多