2013-05-26 2 views
0

меня возникли проблемы с этим вычислениями пунктаCompute пункта Ошибки в SQL Server 2008

Заявления простым выберите сообщение

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 

Ошибки я получаю это

Msg 411, уровень 16, состояние 1, строка 1
Предложение COMPUTE # 1, суммарное выражение # 1 отсутствует в списке выбора.

вот мой полный код sqlfiddle

, что я хочу, чтобы было показать TransactionID и TotalMedicine (производный от величины количества проданной медицины), где год, когда медицина была продана в 2012 году также рассчитывать количество и средние проданные наркотики.

+3

Этот раздел устарел в sql2008 и удаляется в 2012 году. [Ref] (http://msdn.microsoft.com/en-us/library/ms181708 (v = sql.105) .aspx). Вы можете использовать группировки. –

ответ

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 col1 с COMPUTE.

Другой (не имеет отношения к вашей проблеме) проблемой является where year(t1.coldate) = 2012 условие, которое не является sargable. Я бы использовал этот where coldate >= '20120101' and coldate < '20130101', поэтому будет использоваться индекс на coldate. Запрос после всех изменений

... и после ваших комментариев и некоторых экспериментов (которые делают думаю, что это не тривиально сочетать GROUP BY с COMPUTE), возможно, вы должны удалить 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 тест.

+0

То, что я хочу вычислить, это общая сумма и среднее значение col2, а не сумма (col2), и я продолжал получать эту ошибку. –

+0

Мне жаль это говорить, но я все равно получаю ту же ошибку ... вот мой полный код http://sqlfiddle.com/#!3/6a55a Я хотел бы показать TransactionID и TotalMedicine (исходя из количества проданной Медицины), где год, когда лекарство было продано в 2012 году Также подсчитайте количество и средние проданные наркотики. Я хочу использовать ниже синтаксис (сумма, год, группа, вычислить, средняя) –

+0

Я не вижу там запроса, только данные. Возможно, вы связали неправильную скрипку. –

0

Вы должны make your clauses 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 

Или что-то подобное, я бы дать вам точный ответ, но нужно будет более подробно.

+0

Это не дойдет до части «COMPUTE». Будет ошибка, потому что вы не можете «SELECT col2», когда вы «GROUP BY col1» –

+0

Следовательно, * что-то похожее ... – hd1