Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / sum что не так ? / 25 сообщений из 27, страница 1 из 2
30.09.2013, 08:15:37
    #38411356
motorov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum что не так ?
Добрый день у меня есть запрос
Код: 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
30.09.2013, 08:54:16
    #38411366
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum что не так ?
То, что написано, требует интеративного вычисления групповой функции.
Не бывает.
...
Рейтинг: 0 / 0
30.09.2013, 10:25:37
    #38411448
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum что не так ?
Так?
Код: 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
30.09.2013, 10:26:27
    #38411449
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum что не так ?
motorov,

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

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

Akina:

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

-- где ?
...
Рейтинг: 0 / 0
30.09.2013, 10:43:04
    #38411461
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum что не так ?
IF - забавный зверёк. Count() в условии и Count() в варианте выдачи должны считаться отдельно, ибо, несмотря на полное лексическое сходство, они различны. А это уже две итерации расчёта групповой функции, причём набор аргументов при втором расчёте формально зависит от результатов первого расчёта.
...
Рейтинг: 0 / 0
30.09.2013, 10:55:07
    #38411474
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum что не так ?
Но вообще запрос весёлый.
Считается count(*), который, в зависимости от полученного значения, кладётся в одно из 5 полей, а в остальные 4 кладутся нули. Нахрена такое может понадобиться?
...
Рейтинг: 0 / 0
30.09.2013, 10:56:37
    #38411475
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum что не так ?
AkinaНахрена такое может понадобиться?Предполагаю, что для красивого визуального отображения. Если так, то нужно делать на клиенте, а не терзать СУБД.
...
Рейтинг: 0 / 0
30.09.2013, 11:09:49
    #38411497
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum что не так ?
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
30.09.2013, 11:56:49
    #38411575
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum что не так ?
AkinaIF - забавный зверёк. Count() в условии и Count() в варианте выдачи должны считаться отдельно, ибо, несмотря на полное лексическое сходство, они различны. А это уже две итерации расчёта групповой функции, причём набор аргументов при втором расчёте формально зависит от результатов первого расчёта.

Тогда это нужно просто тупо переписать через CASE.
...
Рейтинг: 0 / 0
30.09.2013, 11:59:55
    #38411579
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum что не так ?
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
30.09.2013, 15:43:18
    #38411983
motorov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum что не так ?
Да спасибо, за варианты решения, я пока делал суммирование на стороне клиента,

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

есть записи, в которых есть дата и время, например
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
30.09.2013, 16:27:02
    #38412050
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum что не так ?
motorovесли дата и время у группы одинаково+- 10 мин то это одна ходка
Бред.
15 групп, одна за другой, каждую минуту - это сколько "ходок"?
...
Рейтинг: 0 / 0
30.09.2013, 16:47:13
    #38412073
motorov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum что не так ?
запрос такой

Код: 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
30.09.2013, 16:50:37
    #38412079
motorov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum что не так ?
AkinaБред.
15 групп, одна за другой, каждую минуту - это сколько "ходок"?

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

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

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

на стороне клиента -это делаю вложенным циклом,
но как тут это сделать?
...
Рейтинг: 0 / 0
30.09.2013, 18:30:36
    #38412221
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum что не так ?
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
30.09.2013, 18:39:27
    #38412243
motorov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum что не так ?
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
30.09.2013, 19:12:45
    #38412278
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum что не так ?
motorov,

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

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

1,2,3,12,13 - ?

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

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

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

1,2,3,12,13 - ?

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

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

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

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

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

motorovСейчас оставил так как в php коде выше, он берет и идет циклом от начала записей и сравнивает даты если разница не привышает 10 мин, он их в туже ходку добавляет и считает количество вагонов в ходке
Нарвётесь. Алгоритм, приняв неоднозначные данные, может дать неверные результаты. И я знаю, кого за это будут макать мордой в песок...
...
Рейтинг: 0 / 0
01.10.2013, 10:32:18
    #38412652
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum что не так ?
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
08.10.2013, 17:20:19
    #38420659
motorov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sum что не так ?
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
Форумы / MySQL [игнор отключен] [закрыт для гостей] / sum что не так ? / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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