Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.49 MB
Время: 0.054 c
1-1118222933
Ярослав
2005-06-08 13:28
2005.06.29
Сохранить файл в Unicode


3-1116426225
highlander
2005-05-18 18:23
2005.06.29
Запрос не работает!?


3-1115885131
КиТаЯц
2005-05-12 12:05
2005.06.29
Сложный SQL для статистики


3-1116318431
atruhin
2005-05-17 12:27
2005.06.29
Как подсчитать кол-во уникальных значений поля с учетом NULL


1-1118183356
Gopher
2005-06-08 02:29
2005.06.29
Обращение к реестру





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский