GROUP BY
8 отговора
203 прегледа
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...?
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...?
Re: GROUP BY
ami mislq si 4e problema ne e v group by .
kakuv tip poleta sravnqvash ?I kaji kakva greska dava vse pak.
kakuv tip poleta sravnqvash ?I kaji kakva greska dava vse pak.
Re: GROUP BY
Ами да. Благодаря за подсещането. Разбира се че не е GROUP BY, а просто:
SELECT sum(pole1 * pole2) FROM table WHERE pole3 >nesto-si
SELECT sum(pole1 * pole2) FROM table WHERE pole3 >nesto-si
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
Ти питаш ли или просто си разсъждаваш?
Вниииимавай обаче много за следния ефект за да не си биеш главата в стената впоследствие:
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
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
Таблицата е:
+------+------+
| 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
Re: GROUP BY
а, какво е правилото, което води до тези резулати?
Благодаря предварително за теоретичните разяснения.
Благодаря предварително за теоретичните разяснения.
Re: GROUP BY
Очевидно 2 + NULL = NULL, а не 2...както може би очакваш. Затова пък ако NULL поле е включено в SUM(), то не прави целия резултат NULL.
Ех този salle.
"Животът е това, което се случва с нас, докато правителството си прави реформата." - John Lennon
Ех този salle.
"Животът е това, което се случва с нас, докато правителството си прави реформата." - John Lennon
Редактирано от Dakota на
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
и не е 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