Форум: "Базы";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
Внизsum только по некоторым записям Найти похожие ветки
← →
normandia (2005-05-17 01:43) [0]Помогите, пожалуйста, что-то не могу сам допереть.
Есть таблица с полями,хранящими некоторые измеренные на опеределенных участках замли показатели (pok1 и pok2) и площади участков (s).
Считаю показатели, усредненные по площадям.
То есть
select sum(pok*s)/sum(s) from table1
Все бы хорошо, но на некоторых участках некоторые показатели не измерялись и данных по ним нет. При этом средний показатель должен считаться только по сумме площадей тех участков, по которым есть данные, то есть делить надо на сумму площадей участков, по которым имеются данные о показателях, а sum(s) в знаменателе считает сумму ВСЕХ площадей.
Как быть? Как суммировать поля только тех записей, у которых введены данные по полям pok1 и pok2?
Заранее списибо за советы и мнения.
← →
Lexa (2005-05-17 03:18) [1]Добавь в запрос условие WHERE, а в нем укажи условия какие тебе данные запрашивать для подсчета
← →
Johnmen © (2005-05-17 09:44) [2]
SUM(pok*s)/(AVG(s)*COUNT(s))
← →
Anatoly Podgoretsky © (2005-05-17 09:58) [3]normandia (17.05.05 01:43)
Если не препринимать никаких специальных действий, то так оно и будет, пустые значения не будут суммироваться.
← →
Desdechado © (2005-05-17 10:14) [4]where pok is not null
2 AP
если не известен POK, то числитель будет из меньшего числа записей, чем знаменатель, поэтому where нужен
← →
normandia (2005-05-17 22:48) [5]Прошу прощения за долгое молчание.
Был в отъезде.
Спасибо за подсказки.
Я немного неточно задал вопрос. Обращаю внимание, показателей два (или более).
То есть реально запрос скорее такой
select sum(pok1*s)/sum(s), sum(pok2*s)/sum(s) from table1
И вся беда в том, что в некоторых записях не задан pok1, а в некоторых pok2. И как это учесть через where я пока не совсем допер. Получается по каждому из двух полей запроса считается СВОЯ сумма.
← →
Lexa (2005-05-18 00:45) [6]Через WHere допустим можно так: SELECT SUM(POK*s) ... FROM TABLE WHERE POK IS NOT NULL - тогда выводится пустые значения не будут
← →
normandia (2005-05-18 03:06) [7]Показателей два и более, полей в запросе тоже.
Тогда ...where pok? is not null - который из нескольких показатель (pok1, pok2,...)???
← →
ЮЮ © (2005-05-18 12:06) [8]>И вся беда в том, что в некоторых записях не задан pok1, а в некоторых pok2.
А вместо двух полей в одном запросе выполнить два запроса, возвращающих по одному полю ну просто никак нельзя? :)
← →
normandia (2005-05-18 13:22) [9]
> ЮЮ © (18.05.05 12:06) [8]
В принципе можно, но на самом деле этих полей сильно много (десятки). А запрос содержащий десятки других запросов будет, однако, тормозить.
Хотелось обойтись одним запросом, но похоже не выйдет. Обсуждаемый вариант, скорее всего, наиболее реальный.
Остановлюсь пока на нем.
← →
Johnmen © (2005-05-18 13:46) [10]>И вся беда в том, что в некоторых записях не задан pok1,
Ну и что ? Как это должно влиять на рез-т ?
← →
normandia (2005-05-18 14:27) [11]pok1 pok2 s
------------------
10 NULL 100
NULL 20 200
5 8 300
надо считать так
средний pok1 (10*100+5*300)/(100+300)
средний pok2 (20*200+8*300)/(200+300)
а получается простым запросом
средний pok1 (10*100+5*300)/(100+200+300)
средний pok2 (20*200+8*300)/(100+200+300)
← →
Johnmen © (2005-05-18 15:27) [12]А вот так ?
sum(pok1*s)/sum(pok1*s/pok1)
← →
normandia (2005-05-18 16:26) [13]
> Johnmen © (18.05.05 15:27) [12]
> А вот так ?
> sum(pok1*s)/sum(pok1*s/pok1)
А как насчет деления на ноль?
← →
Johnmen © (2005-05-18 16:32) [14]>normandia (18.05.05 16:26) [13]
>А как насчет деления на ноль?
Я тоже давно хотел спросить про это в sum(pok*s)/sum(s)
:)))
Вобщем так. Либо pok=0 и тогда это др.история, либо pok=null и это наша история...
← →
normandia (2005-05-18 17:59) [15]площадь нулевой не бывает, и нет записей с пустой площадью.
Поэтому sum(pok*s)/sum(s) считает без проблем.
Но если sum(pok*s)/sum(pok*s/pok),
pok=NULL в знаменателе дроби pok*s/pok воспринимается как нуль. Или нет?
← →
Lexa (2005-05-19 00:32) [16]Ну если NULL то WHERE, про которое я тебе толкую уж как нельзя лучше подходит ... туда сколько хочешь полей впихивай, про логические операторы слышал: так вот в твоем случае
...
WHERE
(POK1 IS NOT NULL)
AND
(POK2 IS NOT NULL)
AND
(...)
Можешь еще сюда условия добавить какие тебе нравятся,вплоть до вложенных запросов и будут тебе суммы считаться только по тем записям, которые тебе нравятся. Вообще условие WHERE влияет на то, какие ты строки хочешь извлекать советую о нем узнать побольше ...
← →
Johnmen © (2005-05-19 09:27) [17]>Но если sum(pok*s)/sum(pok*s/pok),
>pok=NULL в знаменателе дроби pok*s/pok воспринимается как нуль. >Или нет?
Или самому попробовать?
← →
normandia (2005-05-19 10:26) [18]Посмотрите пример.
> normandia (18.05.05 14:27) [11]
С where получается сумма площадей в знаменателе для всех столбцов одинаковая.
А надо, чтобы для pok1 sum(s) был один результат, а для pok2 - другой.
> Johnmen © (19.05.05 09:27) [17]
Я и попробовал, а потом написал. Получается ноль.
Короче, списибо за внимание. Я определился.
Будем делать по отдельному подзапросу для каждого поля.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.038 c