powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / sum что не так ?
25 сообщений из 27, страница 1 из 2
sum что не так ?
    #38411356
motorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день у меня есть запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SELECT IF (count(*)<5,
                    count(*),
                    0) AS sum5,
          IF (count(*)>=5
              AND count(*)<10,
                           count(*),
                           0) AS sum10,
             IF (count(*)>=10
                 AND count(*)<15,
                              count(*),
                              0) AS sum15,
                IF (count(*)>=15
                    AND count(*)<20,
                                 count(*),
                                 0) AS sum20,
                   IF (count(*)>=20 ,
                                 count(*),
                                 0) AS sum21
FROM services_vagon s
WHERE s.id_costumer=33
  AND s.date_d_uborka>='2013-08-31 23:59:59'
  AND s.date_d_uborka<='2013-09-10 23:59:59'
GROUP BY s.`id_services`




хочу чтобы он суммы считал sum(IF (count(*)>=20 ,
count(*),
0))
а он выдает ошибку Invalid use of group function
то есть у меня задача посчитать сумму поданных вагонов до 5 за раз и т.д.
группирую по номеру документа,
если не выбирать SUM, то появляется таблица где столбцы правильно все формируют
а почему в суммы не складывает?
...
Рейтинг: 0 / 0
sum что не так ?
    #38411366
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То, что написано, требует интеративного вычисления групповой функции.
Не бывает.
...
Рейтинг: 0 / 0
sum что не так ?
    #38411448
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT 
   SUM(qty <5 ) AS sum5,
   SUM(qty >= 5 AND qty < 10) AS sum10,
   SUM(qty >= 10 AND qty < 15) AS sum15,
   SUM(qty >= 15 AND qty < 20) AS sum20,
   SUM(qty >= 20) AS sum21 
FROM (
   SELECT s.`id_services`,COUNT(*)qty
   FROM services_vagon s 
   WHERE s.id_costumer = 33 AND 
   -- s.date_d_uborka >= '2013-08-31 23:59:59' AND s.date_d_uborka <= '2013-09-10 23:59:59' 
      s.date_d_uborka >= '2013-09-01' AND s.date_d_uborka < '2013-09-11' 
   GROUP BY s.`id_services`
   )q
...
Рейтинг: 0 / 0
sum что не так ?
    #38411449
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorov,

а он выдает ошибку Invalid use of group function

-- приведи полный текст ошибки. Он должен указывать на место в запросе, где.

Akina:

То, что написано, требует интеративного вычисления групповой функции.

-- где ?
...
Рейтинг: 0 / 0
sum что не так ?
    #38411461
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IF - забавный зверёк. Count() в условии и Count() в варианте выдачи должны считаться отдельно, ибо, несмотря на полное лексическое сходство, они различны. А это уже две итерации расчёта групповой функции, причём набор аргументов при втором расчёте формально зависит от результатов первого расчёта.
...
Рейтинг: 0 / 0
sum что не так ?
    #38411474
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но вообще запрос весёлый.
Считается count(*), который, в зависимости от полученного значения, кладётся в одно из 5 полей, а в остальные 4 кладутся нули. Нахрена такое может понадобиться?
...
Рейтинг: 0 / 0
sum что не так ?
    #38411475
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaНахрена такое может понадобиться?Предполагаю, что для красивого визуального отображения. Если так, то нужно делать на клиенте, а не терзать СУБД.
...
Рейтинг: 0 / 0
sum что не так ?
    #38411497
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaIF - забавный зверёк. Count() в условии и Count() в варианте выдачи должны считаться отдельно, ибо, несмотря на полное лексическое сходство, они различны. А это уже две итерации расчёта групповой функции, причём набор аргументов при втором расчёте формально зависит от результатов первого расчёта.Не так. Запрос ТС (немного отформатирован):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
   IF (count(*) < 5, count(*), 0) AS sum5,
   IF (count(*) >= 5 AND count(*) < 10, count(*), 0) AS sum10,
   IF (count(*) >= 10 AND count(*) < 15, count(*), 0) AS sum15,
   IF (count(*) >= 15 AND count(*) < 20, count(*), 0) AS sum20,
   IF (count(*) >= 20, count(*), 0) AS sum21 
FROM services_vagon s 
WHERE s.id_costumer = 33 
   AND s.date_d_uborka >= '2013-08-31 23:59:59' AND s.date_d_uborka <= '2013-09-10 23:59:59' 
GROUP BY s.`id_services`

имеет право на выполенение, более того, он правильно расположит посчитанные количества сервисов в колонках таблицы (значение count(*) будет посчитано только один раз для каждой строки), например, так: id_servicessum5sum10sum15sum20sum21132931430

motorov ,

Другое дело, что для подсчета этого количества необходима группировка по сервисам (указанная в запросе - справляется правильно),
а для повторного подсчета значений во всех сформированных колонках необходима вторая группировка , неявная.

Ошибка в том, что писать SUM(COUNT(*)) нельзя.
...
Рейтинг: 0 / 0
sum что не так ?
    #38411575
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaIF - забавный зверёк. Count() в условии и Count() в варианте выдачи должны считаться отдельно, ибо, несмотря на полное лексическое сходство, они различны. А это уже две итерации расчёта групповой функции, причём набор аргументов при втором расчёте формально зависит от результатов первого расчёта.

Тогда это нужно просто тупо переписать через CASE.
...
Рейтинг: 0 / 0
sum что не так ?
    #38411579
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007
Ошибка в том, что писать SUM(COUNT(*)) нельзя.

Ну,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
...
UNION ALL
select SUM(sum5), SUM(sum10), SUM(sum15), SUM(sum20), SUM(sum21)  
from (
SELECT
   IF (count(*) < 5, count(*), 0) AS sum5,
   IF (count(*) >= 5 AND count(*) < 10, count(*), 0) AS sum10,
   IF (count(*) >= 10 AND count(*) < 15, count(*), 0) AS sum15,
   IF (count(*) >= 15 AND count(*) < 20, count(*), 0) AS sum20,
   IF (count(*) >= 20, count(*), 0) AS sum21 
FROM services_vagon s 
WHERE s.id_costumer = 33 
   AND s.date_d_uborka >= '2013-08-31 23:59:59' AND s.date_d_uborka <= '2013-09-10 23:59:59' 
GROUP BY s.`id_services`
)
...
Рейтинг: 0 / 0
sum что не так ?
    #38411983
motorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да спасибо, за варианты решения, я пока делал суммирование на стороне клиента,

только задачу понял не правильно
тут задача даже интереснее

есть записи, в которых есть дата и время, например
1)dt_fact='2013-09-05 10:50:00'
2)dt_fact='2013-09-02 11:35:00'
3)dt_fact='2013-09-02 11:30:00'
4)dt_fact='2013-09-05 10:30:00'
5)dt_fact='2013-09-05 10:30:00'
6)dt_fact='2013-09-02 11:30:00'
7)dt_fact='2013-09-01 10:30:00'
каждая запись это вагон
мне нужно, как то сгруппировать их по условию,
если дата и время у группы одинаково+- 10 мин то это одна ходка
и надо посчитать количество ходок
тут получается 1 - это первая ходка
2,3,6 - вторая ходка
4,5 - третья ходка
7 четвертая
и результат , - что было 4 ходки за месяц

Можно ли это сделать в одном запросе? Если время и дата была одинаковой было бы проще, но оно может на 10 мин отличаться
...
Рейтинг: 0 / 0
sum что не так ?
    #38412050
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorovесли дата и время у группы одинаково+- 10 мин то это одна ходка
Бред.
15 групп, одна за другой, каждую минуту - это сколько "ходок"?
...
Рейтинг: 0 / 0
sum что не так ?
    #38412073
motorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
запрос такой

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select nomer_vagona, concat (dt_fact, ' ',time_fact) date from services_vagon
where UNIX_TIMESTAMP(concat (dt_fact, ' ',time_fact))>=UNIX_TIMESTAMP('2013-08-31 23:59:59') 
and UNIX_TIMESTAMP(concat (dt_fact, ' ',time_fact))<=UNIX_TIMESTAMP('2013-09-10 23:59:59') and id_costumer=77
union
select nomer_vagona, concat (date_d_uborka, ' ',time_d_uborka) date from services_vagon
where UNIX_TIMESTAMP(concat (date_d_uborka, ' ',time_d_uborka))>=UNIX_TIMESTAMP('2013-08-31 23:59:59') 
and  UNIX_TIMESTAMP(concat(date_d_uborka, ' ',time_d_uborka))<=UNIX_TIMESTAMP('2013-09-10 23:59:59') 
and id_costumer=77
order by date



результат такой


из него мне нужно найти количество, по условию описанному выше
...
Рейтинг: 0 / 0
sum что не так ?
    #38412079
motorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaБред.
15 групп, одна за другой, каждую минуту - это сколько "ходок"?

Это железная дорога))

Если были 15 записей одна за другой в промежутке 10 мин - это одна ходка

Физически смысл, локомотив едет и в одну сторону и сколько вагонов зацепил
и обратно едет тоже с вагонами и если это в течении 10 мин , то эта работа локомотива одна ходка
...
Рейтинг: 0 / 0
sum что не так ?
    #38412084
motorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
результат без сортировки в примере
ее сразу не добавил

на стороне клиента -это делаю вложенным циклом,
но как тут это сделать?
...
Рейтинг: 0 / 0
sum что не так ?
    #38412221
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorovДа спасибо, за варианты решения, я пока делал суммирование на стороне клиента,

только задачу понял не правильно
тут задача даже интереснее

есть записи, в которых есть дата и время, например
1)dt_fact='2013-09-05 10:50:00'
2)dt_fact='2013-09-02 11:35:00'
3)dt_fact='2013-09-02 11:30:00'
4)dt_fact='2013-09-05 10:30:00'
5)dt_fact='2013-09-05 10:30:00'
6)dt_fact='2013-09-02 11:30:00'
7)dt_fact='2013-09-01 10:30:00'
каждая запись это вагон
мне нужно, как то сгруппировать их по условию,
если дата и время у группы одинаково+- 10 мин то это одна ходка
и надо посчитать количество ходок
тут получается 1 - это первая ходка
2,3,6 - вторая ходка
4,5 - третья ходка
7 четвертая
и результат , - что было 4 ходки за месяц

Можно ли это сделать в одном запросе? Если время и дата была одинаковой было бы проще, но оно может на 10 мин отличаться

уточните, сколько ходок будет в каждом случае,
даны только минуты:
1,11,21 - ?
1,10,11,12 - ?
1,9,10,11 - ?
1,11,12,13 - ?
1,2,3,12,13 - ?
1,2,3,13,14 - ?
1,2,3,14,15 - ?
...
Рейтинг: 0 / 0
sum что не так ?
    #38412243
motorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbcуточните, сколько ходок будет в каждом случае,
даны только минуты:
1,11,21 - ?
1,10,11,12 - ?
1,9,10,11 - ?
1,11,12,13 - ?
1,2,3,12,13 - ?
1,2,3,13,14 - ?
1,2,3,14,15 - ?

Добрый день
не совсем понял
сделаю пример из таблицы-картинки которая выше
там вагон 59718858 - это одна ходка
вагоны 56942808,53452728, 53733440,52765849,52669223 - это вторая ходка(так как их время в диапазоне 10 мин у первых 4 равно у пятого на 10 мин больше)
и остальные по одной ходке
в итоге 6 ходок сделал локомотив

сейчас в php стелал такой код:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
$r = mysql_query ($q_vyh);
	$s5 = 0; 
	$s10 = 0; 
	$s15 = 0; 
	$i=0;
    while ($row2 = mysql_fetch_array($r, MYSQL_ASSOC)) {
	echo $row2['nomer_vagona'].' = ';
	if ($i>0) {
			$d = $row2['date'];
			echo ($dt).'----'.($row2['date']).'<br>';
			
			if (strtotime($d)<=(strtotime($dt)+660)) {echo 'Равно<br>';$col=$col+1;}
		else {
			if ($col<=5) $s5++;
			echo 's5='.$s5.'<br>';
			if ($col<=10 && $col>5) $s10++;
			if ($col>10) $s15++;		
			$col=1;
		}
		$dt=$row2['date'];
	} else {
		$col = 1;
		echo  $row2['date'].'<br>';
		$dt = $row2['date'];
	}
	echo $col.'<br>';
	$i++;
	}


считает количество ходок, и в зависимости сколько в ходке было вагонов, записывает в соответствующую переменную.
Не знаю может так проще сделать, просто пытаюсь изучить какие можно sql запросы делать
...
Рейтинг: 0 / 0
sum что не так ?
    #38412278
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorov,

ваш пример понятен. Я привел другие примеры и
прошу выдать конечный результат, Напромер:

если для какого-то вагона есть записи на первой,
второй, 3, 12,13-ой минутах, сколько ходок это будет?

1,2,3,12,13 - ?

Точно также оттветте пожалуйста и на остальные мои примеры.
...
Рейтинг: 0 / 0
sum что не так ?
    #38412310
motorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbcmotorov,

ваш пример понятен. Я привел другие примеры и
прошу выдать конечный результат, Напромер:

если для какого-то вагона есть записи на первой,
второй, 3, 12,13-ой минутах, сколько ходок это будет?

1,2,3,12,13 - ?

Точно также оттветте пожалуйста и на остальные мои примеры.

Для одного вагона это исключено чтобы были записи через несколько минут
программа ведет учет когда вагон подан и когда убран
два раза подан он не может,
в общем если откинуть номер вагона . то (1,2,3) - это одна ходка
(12,13) - вторая
хотя нет у меня программа посчитает одной
если вы имеете ввиду что между 3 и 12 тоже диапазон подходит
но тут считается от начала движения то есть в 1 он поехал, дрын дрын и ...

В общим да это будет одна ходка
буду еще думать правильно ли это
да наверное правильно, просто на практике у них
такое не встречал
ведь локо зацепил 5 вагонов в одну сторону и время у них одинаковое
и 3 в другую и время в диапазоне
и получается 8 вагонов в одной ходке
...
Рейтинг: 0 / 0
sum что не так ?
    #38412362
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы должны сначала отбросить слова "не может быть" - может быть АБСОЛЮТНО ВСЁ.
После этого Вы должны построить математически строгий алгоритм разделения набора "групп" на "ходки". Который на ЛЮБОМ наборе "групп" даст ОДНОЗНАЧНЫЙ ответ.
А потом приходите - поможем воплотить этот алгоритм в коде.
...
Рейтинг: 0 / 0
sum что не так ?
    #38412514
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaВы должны сначала отбросить слова "не может быть" - может быть АБСОЛЮТНО ВСЁ.Akina, ну это уже перебор. Пусть ТС задаёт условия, которым удовлетворяют данные, но он должен чётко понимать, что если запрос написан в расчёте на их, условий, выполнение, а данные когда-нибудь перестанут им удовлетворять, то такой запрос может выдать (и выдаст!) чушь.
AkinaПосле этого Вы должны построить математически строгий алгоритм разделения набора "групп" на "ходки". Который на ЛЮБОМ наборе "групп" даст ОДНОЗНАЧНЫЙ ответ.на любом допустимом наборе
и пусть потом не говорит, что его не предупреждали :)
...
Рейтинг: 0 / 0
sum что не так ?
    #38412522
motorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaВы должны сначала отбросить слова "не может быть" - может быть АБСОЛЮТНО ВСЁ.
После этого Вы должны построить математически строгий алгоритм разделения набора "групп" на "ходки". Который на ЛЮБОМ наборе "групп" даст ОДНОЗНАЧНЫЙ ответ.
А потом приходите - поможем воплотить этот алгоритм в коде.

Я вас понял, просто ТЗ как такового нет и есть желания заказчики и есть их методы расчета на листочках
по этому и мое часто недопонимание
Сейчас оставил так как в php коде выше, он берет и идет циклом от начала записей и сравнивает даты
если разница не привышает 10 мин, он их в туже ходку добавляет.
и считает количество вагонов в ходке
...
Рейтинг: 0 / 0
sum что не так ?
    #38412545
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorov , я уже понимаю, что это коммерческая задача. А потому - если вы не сделаете настоящее ТЗ, геморрой в будущем обеспечен. То не так, это доделай, вон того нехватает, а это не так считается... оно тебе надо?

tanglirна любом допустимом наборе[/quot]Проверка на допустимость - это часть алгоритма. ИМХО.

motorovСейчас оставил так как в php коде выше, он берет и идет циклом от начала записей и сравнивает даты если разница не привышает 10 мин, он их в туже ходку добавляет и считает количество вагонов в ходке
Нарвётесь. Алгоритм, приняв неоднозначные данные, может дать неверные результаты. И я знаю, кого за это будут макать мордой в песок...
...
Рейтинг: 0 / 0
sum что не так ?
    #38412652
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorovно тут считается от начала движения то есть в 1 он поехал, дрын дрын и ...а с чего вы взяли, что "в 1 он поехал"? почему именно этот момент - "начало движения"? может, он поехал в "-9", и тогда момент "3" уже брать не надо... или надо?

motorovВ общим да это будет одна ходкав лоб:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select 
 dt
 /*,timediff(dt,(select dt from table q where q.dt<t.dt order by 1 desc limit 1)) delta*/
 ,if(timediff(dt,(select dt from table q where q.dt<t.dt order by 1 desc limit 1)) < interval '10 minute'
  ,@gn
  ,@gn:=@gn+1
 ) as gn
from table t
,(select @gn:=1) zz
order by dt
...
Рейтинг: 0 / 0
sum что не так ?
    #38420659
motorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirmotorovно тут считается от начала движения то есть в 1 он поехал, дрын дрын и ...а с чего вы взяли, что "в 1 он поехал"? почему именно этот момент - "начало движения"? может, он поехал в "-9", и тогда момент "3" уже брать не надо... или надо?

motorovВ общим да это будет одна ходкав лоб:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select 
 dt
 /*,timediff(dt,(select dt from table q where q.dt<t.dt order by 1 desc limit 1)) delta*/
 ,if(timediff(dt,(select dt from table q where q.dt<t.dt order by 1 desc limit 1)) < interval '10 minute'
  ,@gn
  ,@gn:=@gn+1
 ) as gn
from table t
,(select @gn:=1) zz
order by dt



Да спасибо я попробую

А условия правильные такие. В одну ходку попадают все записи в течении 10 мин начиная с первой
допустим минуты 1 2 3 9 12 13
тут 1 2 3 9 одна ходка, 10 мин считается с 1
затем 12 уже не на удовл. условию, начинает считаться вторая ходка от 12

сделал подсчет в программе на данный момент
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / sum что не так ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]