0

我在使用这个按子句计算时遇到问题

该语句是一个简单的选择

Select 
    col1, sum(col2) 
from 
    table1 t1
join
    table2 t2 on t1.col1=t2.col1
where 
    year(t1.coldate) = 2012
Group by 
    col1
order by 
    col1
Compute 
    Sum(col2), avg(col2) by col1

我不断收到的错误消息是

消息 411,级别 16,状态 1,第 1 行
COMPUTE 子句 #1,聚合表达式 #1 不在选择列表中。

这是我的完整代码sqlfiddle

我想要的是显示 TransactionID 和 TotalMedicine (来自已售药物的数量),该药物在 2012 年出售的年份。还要计算数量和平均售出的药物。

4

2 回答 2

3

我认为这COMPUTE可以应用于SELECT子句中的列,因此您必须定义别名并使用它们:

Select 
    col1, sum(col2) AS sum_col2                  --- alias
...

Compute 
    Sum(sum_col2), avg(sum_col2) by col1 ;       --- using the alias

而且我不确定您是否想要,by col1因为您已经按该列分组。如果您想要 的总和和平均值,请从 中sum_col2删除。by col1COMPUTE

另一个(与您的问题无关)问题是where year(t1.coldate) = 2012条件 which is not sargable。我会使用它where coldate >= '20120101' and coldate < '20130101',以便使用索引coldate。所有更改后的查询

...并且在您的评论和一些实验之后(这使得认为与 结合并非易事GROUP BYCOMPUTE,也许您应该删除GROUP BY

Select 
    t1.col1, col2
from 
    table1 t1
join
    table2 t2 on t1.col1 = t2.col1
where 
    coldate >= '20120101' and coldate < '20130101'
order by 
    col1
Compute 
    Sum(col2), Avg(col2)  by col1                 -- for every col1
Compute 
    Sum(col2), Avg(col2)                          -- and overall
  ;  

正如@Bogdan Shalean 正确评论的那样,COMPUTE正在弃用,您应该使用GROUP BY GROUPING SETS

Select 
    t1.col1, 
    SUM(col2) AS TotalMedicine,
    AVG(col2) AS AverageMedicine
from 
    table1 t1
join
    table2 t2 on t1.col1 = t2.col1
where 
    coldate >= '20120101' and coldate < '20130101'
Group By Grouping Sets
    ( (col1),
      ()
    )
  ;

请参阅SQL-Fiddle测试。

于 2013-05-26T17:50:01.483 回答
0

您需要使您的子句 match,因此请尝试:

Select 
    col2, sum(col2)  
from 
    table1 t1 
join 
    table2 t2 on t1.col1 = t2.col1 
where 
    year(t1.coldate) = 2012 
Group by 
    col1 
order by
    col1 
Compute 
    Sum(col2), avg(col2) by col1

或者类似的东西,我会给你一个确切的答案,但需要更多细节。

于 2013-05-26T15:05:12.713 回答