是否可以在不使用group by子句的情况下计算表中每个组的总和

时间:2014-09-22 04:38:41

标签: sql sql-server database tsql plsql

我试图找出是否有任何方法来汇总每种产品的销售额。我意识到我可以通过使用group-by子句或通过编写一个过程来实现它。 例如:

       Table name: Details
       Sales  Product
       10      a
       20      a
       4       b
       12      b
       3       b
       5       c

是否有可能在不使用逐个查询的情况下执行以下查询

select 
    product, 
    sum(sales) 
from 
    Details 
group by 
    product 
having 
    sum(sales) > 20

我意识到可以使用过程,可以用其他任何方式完成吗?

3 个答案:

答案 0 :(得分:3)

你可以做到

SELECT product,
     (SELECT SUM(sales) FROM details x where x.product = a.product) sales
from Details a;

(并将其包装到另一个选择中以模拟HAVING)。

答案 1 :(得分:1)

可以使用分析函数进行求和计算,然后用另一个查询对其进行包装以进行过滤。

See and play with the example here.

select 
  running_sum,
  OwnerUserId
from (
  select
    id,
    score,
    OwnerUserId,
    sum(score) over (partition by OwnerUserId order by Id) running_sum,
    last_value(id) over (partition by OwnerUserId order by OwnerUserId) last_id
  from
    Posts
  where
  OwnerUserId in (2934433, 10583)
) inner_q
where inner_q.id = inner_q.last_id
--and running_sum > 20;

我们在所有者(产品)的分区上保留一个运行总和,并且我们计算同一窗口的最后一个ID,这是我们用来获得总和的ID。用另一个查询包装它以确保你得到"最后一个id",取总和,然后对结果进行任何你想要的过滤。

这是避免使用GROUP BY的极其圆润的方法。

答案 2 :(得分:-1)

如果您不想要嵌套的select语句(运行速度较慢),请使用CASE:

select 
    sum(case 
            when c.qty > 20 
            then c.qty 
            else 0 
        end) as mySum
from Sales.CustOrders c