【问题标题】:SQL server Query Count() OptimizationSQL server Query Count() 优化
【发布时间】:2013-10-12 08:32:17
【问题描述】:

我使用的是 SQL Server 2005。我在查询中使用了 3 次 Count()

select    
    p.side,
    p.uid as uid,
    count (p.side) as cside,
    (count (p.side)/ 3) as pairs,
    ((count (p.side)/ 3) * 15 ) as commisonPrice
from  
    tempComm as p
group by 
    p.side , p.uid
order by 
    p.uid;

它给了我正确的输出,但问题是如何通过在我的查询中使用这种重复性来防止?

【问题讨论】:

  • 你追求效率还是优雅?
  • 为了效率,数据会快速增长,所以我主要关注性能,高效地计算和检索数据
  • 您应该在问题中说明这一点。你得到的答案并不比你的查询更有效率。
  • 这似乎效率不高。 . .你能建议我写这个查询的一种有效方法吗

标签: sql sql-server-2005 count query-optimization


【解决方案1】:
select 
    side,
    uid,
    cside,
    cside/3 as pairs,
    cside/3*15 as commisonPrice 
from
(
    select
    p.side ,
    p.uid as uid , 
    count (p.side) as cside
    from tempComm as p 
    group by p.side , p.uid
) t
order by uid; 

【讨论】:

  • 也需要一点解释
  • 所以你声称这样更有效率?
  • 问题不在于效率,而在于口是心非
【解决方案2】:

几种方法。

1. Common Table Expression - 在 SQL Server 2005 中引入

;用 cte 作为 (

    select    
          p.side,
          p.uid as uid,
          count (p.side) as cside
    from  tempComm as p
    group by p.side , p.uid

)

select * , cside / 3 as pairs , (cside / 3) * 15 as commisonPrice
from cte
order by p.uid;

2。派生表

select 
    side,
    uid,
    cside,
    cside/3 as pairs,
    (cside/3)*15 as commisonPrice 
from
(
    select
    p.side ,
    p.uid as uid , 
    count (p.side) as cside
    from tempComm as p 
    group by p.side , p.uid
) t
order by uid; 

其他方法是使用临时表、视图,您必须首先在其中插入数据并对列执行进一步操作,但我认为您的问题不需要它们。

注意:

  1. CTE 和派生表都只能使用一次,如果您需要 对您的数据执行多项操作,然后使用临时 表格。

  2. 性能方面,CTE 和派生表具有相似的性能, 它只是偏好问题,您希望哪一个更具可读性 并且可以理解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多