2016-06-29 7 views
0

Я использую Oracle, я пытаюсь подвести мой вычисляемый столбец, но я не знаю, какSQL - Как суммировать мой вычисляемый столбец

SELECT a.ID, a.grade_code, 
ROUND((sum(a.grade)/b.quantity)*b.percentage/100,2) as promedio 
FROM grade a 
INNER JOIN distri_grade b 
ON b.grade_code = a.grade_code 
group by a.ID, a.grade_code, b.quantity, b.percentage 
order by a.ID, a.grade_code 

Результат:

enter image description here

Что я ищу:

ID - PROMEDIO 
1 - 71.81 
+0

Удалить 'a.grade_code' из предложений' SELECT', 'GROUP BY' и' ORDER BY'. –

+0

Возможно, я не понимаю ваш вопрос. В вашем запросе не будет всего 2 столбца. Возможно, вы могли бы также включить образцы данных? – sgeddes

ответ

1

Было бы что-то вроде этого:

SELECT g.ID, 
     ROUND(sum((g.grade/dg.quantity) * dg.percentage/100), 2) as promedio 
FROM grade g INNER JOIN 
    distri_grade dg 
    ON dg.grade_code = g.grade_code 
group by g.ID 
order by g.ID; 

Если вы хотите один ряд на ID, то, что это единственный столбец, который должен идти в GROUP BY , Я размышляю немного о том, что формула вы ищете. В любом случае все используемые столбцы должны быть аргументами функции агрегации sum().

Примечание: псевдонимы таблиц, которые являются аббревиатурами для имен таблиц, намного легче читать.

1

Если я правильно понять, удалить quantity и percentage поля из статьи group by. Кроме того, добавить скобки вокруг всего sum пункта:

SELECT a.ID, a.grade_code, 
    round(sum((a.grade/b.quantity)*(b.percentage/100)),2) as promedio 
FROM grade a 
    INNER JOIN distri_grade b 
      ON b.grade_code = a.grade_code 
group by a.ID, a.grade_code 
order by a.ID, a.grade_code 
+1

@TimBiegeleisen - Да, вы можете быть верны, но я не уверен на 100%, зависит от желаемых результатов. На данный момент вопрос немного неясен, если честно. Этот запрос не привел бы к такому результату ... – sgeddes

0

У меня сложилось впечатление, что вы хотите:

SELECT 
    a.ID, 
    ROUND(sum(a.grade)/min(b.quantity) * min(b.percentage)/100, 2) as promedio 
FROM grade a INNER JOIN distri_grade b ON b.grade_code = a.grade_code 
group by a.ID 

Мне кажется, от того, что вы пытаетесь, что все значения из distri_grade (ака b) фиксируются для всех строк, прикрепленных к одному ID. Когда они являются константами, оно истинно алгебраически, что sum(a.grade/QUANTITY * PERCENTAGE) = sum(a.grade)/QUANTITY * PERCENTAGE из-за дистрибутивного свойства умножения по сложения. В SQL способ вытащить эти «постоянные» значения над группой - использовать фиктивную агрегацию, такую ​​как min() или max(). И хотя вы можете просто обернуть суммирование вокруг всего выражения, этот метод, вероятно, имеет преимущество (в зависимости от используемых типов данных) в числовой точности, делая деление и умножение только один раз. Обратите также внимание на то, чтобы быть осторожным с целым делением, поскольку я предполагаю, что ваши три столбца потенциально являются целыми числами.