有效地使用SQL GROUP BY的,SUM,COUNT(Efficient use of SQL

2019-09-18 17:37发布

我对我们的产品的销售,可能看起来如下表:

product   | amount   | ptype    | pdate      
p1        | 1.00     | sale     | 01/01
p1        | 2.00     | base     | 01/02
p2        | 1.50     | sale     | 02/03
p3        | 5.25     | base     | 10/10

我想建立一个表,其中显示每行一个产品,该金额的总和,如果该产品是独秀别的类型显示类型为“VAR”,如果该产品是独秀否则日期显示日期为NULL。 这样的结果如下所示:

product   | total    | ptype    | pdate      
p1        | 3.00     | VAR      | (NULL)
p2        | 1.50     | sale     | 02/03
p3        | 5.25     | base     | 10/10

我完成的结果,我需要通过执行以下操作:

SELECT DISTINCT product
,(SELECT SUM(amount) FROM T as b GROUP BY b.product HAVING a.product = b.product ) as total
,(SELECT CASE WHEN COUNT(*) = 1 THEN a.ptype  ELSE 'VAR' END from T as b GROUP BY b.product HAVING a.product = b.product) as ptype
,(SELECT CASE WHEN COUNT(*) = 1 THEN a.pdate  ELSE NULL END from T as b GROUP BY b.product HAVING a.product = b.product) as pdate
FROM T as a

但我想知道是否有是完成同样的结果更有效的方式。

Answer 1:

有没有必要使用任何形式的子查询或内嵌视图。 根据数据库引擎的复杂性,这些结构可能会产生负面影响性能。

这里是你要求的是什么,应该给予可靠的结果与表上,即使是最原始的SQL引擎的单次扫描。

select product,
       sum(amount) as amount,
       case when count(*)=1 then min(ptype) else 'VAR' end as ptype,
       case when count(*)=1 then min(pdate) else null end as pdate
  from T
 group by product

以下是不完全是你要求什么,但我认为这可能是更接近你实际上是在寻找。 它只有在有组成聚集多个不同值报告p型为VAR或PDATE为NULL。

我添加了一个pcount列,这样,你仍然可以识别单聚集,即使两个p型和PDATE不nulll。

select product,
       sum(amount) as amount,
       count(*) as pcount,
       case when count(distinct ptype)=1 then min(ptype) else 'VAR' end as ptype,
       case when count(distinct pdate)=1 then min(pdate) else null end as pdate
  from T
 group by product


Answer 2:

如果你运行这个对任何主流数据库(如SQL Server),查询优化器可能会照顾最优化的代表您。 这就是说,你可以用具有由一个组内查询做到这一点很容易地。 这里是工作,你可以打一个比方:

http://sqlfiddle.com/#!3/f2e05/19/1



Answer 3:

试试这段代码:

SELECT DISTINCT product, x.total,
IF(COUNT(x.ptype) > 1, 'VAR', x.ptype) AS ptype,
IF(COUNT(x.pdate) > 1, NULL, x.pdate) AS pdate
FROM (SELECT DISTINCT product, SUM(amount) AS total, ptype, pdate FROM table GROUP BY product) AS x
JOIN table ON x.product = table.product
GROUP BY x.product;

希望它的工作原理。



文章来源: Efficient use of SQL GROUP BY, SUM, COUNT