GROUP BY

8 отговора 203 прегледа
#1

GROUP BY

Моля ви помогнете да довърша този SELECT.

SELECT sum(pole1 * pole2) FROM table WHERE pole3 >nesto-si GROUP BY....????

ако условието е pole3=nesto-si пиша:
SELECT sum(pole1 * pole2) FROM table WHERE pole3=nesto-si GROUP BY pole3

и става. Но при pole3>nesto-si...?

Отговор
в отговор на ano #2

Re: GROUP BY

ami mislq si 4e problema ne e v group by .
kakuv tip poleta sravnqvash ?I kaji kakva greska dava vse pak.

Отговор
в отговор на newbie #3

Re: GROUP BY

Ами да. Благодаря за подсещането. Разбира се че не е GROUP BY, а просто:

SELECT sum(pole1 * pole2) FROM table WHERE pole3 >nesto-si

Отговор
в отговор на ano #4

Re: GROUP BY

Ама .... човеко .... ти това вече го беше написал....

Ти питаш ли или просто си разсъждаваш?

Вниииимавай обаче много за следния ефект за да не си биеш главата в стената впоследствие:

select count(*), sum(p1 + p2) as sum1, sum(p1) + sum(p2) as sum2 from t;
+----------+------+------+
| count(*) | sum1 | sum2 |
+----------+------+------+
| 6 | 13 | 19 |
+----------+------+------+



Забележи разликата между Sum1 и Sum2. В математиката двете щяха да са равни нали?
Това не е грешка - точно такъв трябва да бъде резултата.
Опитай се да разбереш кога и защо се получава така.
Иначе ще си имаш ужасно много проблеми в бъдеще.

За да те объркам още повече (а всъщност е подсказване) ето още нещо за същата таблица:

select count(*), sum(p1), avg(p1), sum(p2), avg(p2) from t;
+----------+---------+---------+---------+---------+
| count(*) | sum(p1) | avg(p1) | sum(p2) | avg(p2) |
+----------+---------+---------+---------+---------+
| 6 | 8 | 2.0000 | 11 | 2.7500 |
+----------+---------+---------+---------+---------+

Linux is like a wigwam - No Windows, No Gates, Apache inside
Отговор
в отговор на salle #5

Re: GROUP BY

е, предавам се. :(
сигурно е нещо свързано с типа на данните...

Отговор
в отговор на ano #6

Re: GROUP BY

Не точно с типа а с това дали има NULL или не.

Таблицата е:
+------+------+
| p1 | p2 |
+------+------+
| 2 | NULL |
| 4 | 5 |
| 1 | NULL |
| NULL | 1 |
| NULL | 2 |
| 1 | 3 |
+------+------+

Мисълта ми беше много да внимаваш със сметките когато имаш NULL

Linux is like a wigwam - No Windows, No Gates, Apache inside
Отговор
в отговор на salle #7

Re: GROUP BY

а, какво е правилото, което води до тези резулати?
Благодаря предварително за теоретичните разяснения.

Отговор
в отговор на ano #8

Re: GROUP BY

Очевидно 2 + NULL = NULL, а не 2...както може би очакваш. Затова пък ако NULL поле е включено в SUM(), то не прави целия резултат NULL.

Ех този salle.

"Животът е това, което се случва с нас, докато правителството си прави реформата." - John Lennon

Редактирано от Dakota на

Отговор
в отговор на Dakota #9

Re: GROUP BY

Не е "очевидно" а е Закон

и не е NULL + 2 = NULL а е NULL + 2 дава резултат NULL

изобщо тъй като NULL означава "липса на стойност" за всички операции включващи NULL резултатът е недефиниран или в SQL терминологията NULL

1 + NULL -> NULL
NULL + NULL -> NULL
NULL - NULL -> NULL
и така нататък.

Същото е и за сравненията
NULL > NULL -> 0 (false)
NULL < NULL -> 0
NULL = NULL -> 0
единствено е вярно
NULL IS NULL -> 1
NULL IS NOT NULL -> 0


При SUM() и при всички обощаващи функции (тези дето се използват с GROUP BY) нещата са малко по-други но пак коректни от гледна точка на нормалната човешка логика:

SUM() = сума от стойностите във всички редове там където ги има !!

По-разбираемо е за AVG()

За:

2
NULL
3

AVG() дава (2+3)/2 = 2.5 в което има логика - NULL е липсваща стойност. Има само две валидни стойности 2 и 3

Linux is like a wigwam - No Windows, No Gates, Apache inside
Отговор