SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 30.10.2013 15:40:14

zhenia
Участник
Зарегистрирован: 30.10.2013
Сообщений: 7

Посчитать разные значения.

Доброго времени суток.
Нужно подсчитать и вывести количество номеров за определённыое количество времени.
Но (для меня) проблема заключается в том, что номера в таблице различаются.
Таблица одна, DESCRIBE table1;
+----------+----------------+----+------+--------------------------+--------+
| Field           | Type             | Null | Key   | Default                     | Extra    |
+----------+----------------+----+------+--------------------------+--------+
| date        | datetime        | NO  |        | 0000-00-00 00:00:00     |            |
| number    | varchar(80)      | NO  |        |                             |            |
+----------+----------------+----+------+--------------------------+--------+



Пишу запрос:

SELECT number, COUNT(*) FROM table1
    WHERE date BETWEEN '2013-09-01 00:00:00' AND '2013-09-30 23:59:59'
    AND (
           number LIKE '%444-55-60%'
        OR number LIKE '%444-55-61%'
        OR number LIKE '%444-55-62%'
        OR number LIKE '%444-55-63%'
                OR number LIKE '%444-55-64%'
        )
GROUP BY number;

Получаю:

+----------------------------+----------+
| number                     | COUNT(*)|
+----------------------------+----------+
| Kiev-444-55-60                 |       10     |
| Kiev-444-55-60 <044>      |       12      |
| Kiev-444-55-60 <044-2>      |       11        |
| Kiev-444-55-61 <0001>      |        2      |
| Kiev-444-55-61 <9534>      |       15     |
| Kiev-444-55-62 <044>      |       20      |
| Kiev-444-55-63 <044>      |        5      |
| Kiev-444-55-63 <044-3>      |       16      |
+----------------------------+----------+

В идеале нужно получить вот это:

+---------------------+-----------+
| number            | COUNT(*)    |
+---------------------+-----------+
| Kiev-444-55-60        |       33    |
| Kiev-444-55-61     |       17     |
| Kiev-444-55-62     |       20     |
| Kiev-444-55-63      |       21     |
+---------------------+-----------+

Как это сообразить, где почитать, что искать. В sql ещё совсем зелёный, неделю только как начал "изучать".

Неактивен

 

#2 30.10.2013 15:44:32

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Посчитать разные значения.

Доброго времени суток.

Что является "основой" номера?

То естьКак из
Kiev-444-55-60 <044-2>
получить
444-55-60
?

Слева всегда находится kiev или как?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 30.10.2013 15:58:09

zhenia
Участник
Зарегистрирован: 30.10.2013
Сообщений: 7

Re: Посчитать разные значения.

deadka написал:

Доброго времени суток.

Что является "основой" номера?

То естьКак из
Kiev-444-55-60 <044-2>
получить
444-55-60
?

В принципе да. Как подсчитать все записи в которых основа - допустим 444-55-60 + 444-55-61 + 444-55-62 +.....
И вывести "построчно"

deadka написал:

Слева всегда находится kiev или как?

Нет, там может быть и " и 'gorod' и 'poltava'

Неактивен

 

#4 30.10.2013 16:37:55

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Посчитать разные значения.

Вы должны знать какой-то механизм для "выкусывания" 444-55-60
из строки. regexpom или еще как - в общем, это должно быть автоматизировано.
Как предложите - можно будет и запрос составить.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 30.10.2013 18:17:22

zhenia
Участник
Зарегистрирован: 30.10.2013
Сообщений: 7

Re: Посчитать разные значения.

deadka написал:

Вы должны знать какой-то механизм для "выкусывания" 444-55-60
из строки. regexpom или еще как - в общем, это должно быть автоматизировано.
Как предложите - можно будет и запрос составить.

А что с LIKE не так? Или под словом "выкусывать" имеется что-то другое, не пойму.
Мне нужно каким то образом суммировать определённые строки.
Я понимаю что я могу что-то не правильно и непонятно для вас излогать hmm, но ввиду нубоватости в sql по другому пока не могу.

Неактивен

 

#6 30.10.2013 19:19:29

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Посчитать разные значения.

SELECT if(number LIKE '%444-55-60%','444-55-60',if(number LIKE '%444-55-61%','444-55-61',if(number LIKE '%444-55-62%','444-55-62',if(number LIKE '%444-55-63%','444-55-63','444-55-64')))) as number, COUNT(*) FROM table1
    WHERE date BETWEEN '2013-09-01 00:00:00' AND '2013-09-30 23:59:59'
    AND (
           number LIKE '%444-55-60%'
        OR number LIKE '%444-55-61%'
        OR number LIKE '%444-55-62%'
        OR number LIKE '%444-55-63%'
                OR number LIKE '%444-55-64%'
        )
GROUP BY number;
 

Неактивен

 

#7 30.10.2013 19:23:58

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Посчитать разные значения.

Ага, если исходить из того, что существуют только
444-55-60
444-55-61
444-55-62
444-55-63
, то можно так. Просто при добавлении нового - придется снова запрос модифицировать. Я думал что-то более универсальное сообразить, поэтому и спрашивал про методу выкусывания.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#8 30.10.2013 20:03:13

zhenia
Участник
Зарегистрирован: 30.10.2013
Сообщений: 7

Re: Посчитать разные значения.

На самом деле номеров около 30ти, поэтому запрос походу будет километровым(.
Сообразил вот такое:
SELECT
T1.tel1 AS '444-55-60',
T2.tel2 AS '444-55-61',
T3.tel3 AS '444-55-62'
FROM
  (SELECT COUNT(*) AS tel1 FROM table1
    WHERE date BETWEEN '2013-09-01 00:00:00' AND '2013-09-30 23:59:59'
    AND number LIKE '%444-55-60%'
   ) T1,
  (SELECT COUNT(*) AS tel2 FROM table1
    WHERE date BETWEEN '2013-09-01 00:00:00' AND '2013-09-30 23:59:59'
    AND number LIKE '%444-55-61%'
   ) T2,
  (SELECT COUNT(*) AS tel3 FROM table1
    WHERE date BETWEEN '2013-09-01 00:00:00' AND '2013-09-30 23:59:59'
    AND number LIKE '%444-55-62%'
   ) T3;

Но, как бы это сказать, чуть не в ту сторону. И опять же 30 номеров....

Неактивен

 

#9 30.10.2013 20:07:27

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Посчитать разные значения.

Не совсем понял, чем Вам не подошёл запрос от vasya.
Если около 30, то действительно будет слишком длинный. Так что моя рекомендация в силе - формализуйте, как можно выкусить из середины поля непосредственно номер, по по которому хотите сгруппировать.
Cм. в сторону regexp,
substring,
locate.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#10 30.10.2013 21:04:18

zhenia
Участник
Зарегистрирован: 30.10.2013
Сообщений: 7

Re: Посчитать разные значения.

Запрос от vasya выдал мне примерно то же что я уже видел:

+----------------------------+----------+
| number                     | COUNT(*)|
+----------------------------+----------+
| Kiev-444-55-60                 |       10     |
| Kiev-444-55-60                 |       12      |
| Kiev-444-55-60                 |       11      |
| Kiev-444-55-61                |        2      |
| Kiev-444-55-61                |       15     |
| Kiev-444-55-62                |       20      |
| Kiev-444-55-63                |        5      |
| Kiev-444-55-63                |       16      |
+----------------------------+----------+

а мне, грубо говоря, нужна сума строк содержащих 444-55-60 = 33. Следующая строка 444-55-61 = 17 и тд.
То есть:

+-----------------------------------+----------------------+
| номер                                        |       количество        |
+-----------------------------------+----------------------+
| строки содержащие 444-55-60     |   33(общее кол-во)     |
| строки содержащие 444-55-61     |   17(общее кол-во)     |
| строки содержащие 444-55-62     |   20(общее кол-во)     |
...
+-----------------------------------+----------------------+

Неактивен

 

#11 30.10.2013 21:31:43

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Посчитать разные значения.

Хм. Приведите структуру таблицы (show create table table1) и данные ( insert into table1... ).


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#12 30.10.2013 22:02:37

zhenia
Участник
Зарегистрирован: 30.10.2013
Сообщений: 7

Re: Посчитать разные значения.

deadka написал:

Хм. Приведите структуру таблицы (show create table table1) и данные ( insert into table1... ).

Не очень понятно что вы хотите увидеть. Я в первом посте написал(DESCRIBE), или этого не достаточно?
Таблица состоит из двух столбцов:
дата - номер
при этом номера внесены криво, но по семизначному номеру их можно сгруппировать.
Мне нужно сосчитать количество этих самих номеров у которых "корень" одинаков.

Неактивен

 

#13 30.10.2013 22:06:07

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Посчитать разные значения.


SELECT if(number LIKE '%444-55-60%','444-55-60',if(number LIKE '%444-55-61%','444-55-61',if(number LIKE '%444-55-62%','444-55-62',if(number LIKE '%444-55-63%','444-55-63','444-55-64')))) as xxx, COUNT(*) FROM table1
    WHERE date BETWEEN '2013-09-01 00:00:00' AND '2013-09-30 23:59:59'
    AND (
           number LIKE '%444-55-60%'
        OR number LIKE '%444-55-61%'
        OR number LIKE '%444-55-62%'
        OR number LIKE '%444-55-63%'
                OR number LIKE '%444-55-64%'
        )
GROUP BY xxx;

 

Неактивен

 

#14 30.10.2013 22:08:39

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Посчитать разные значения.

deadka написал:

Хм. Приведите структуру таблицы (show create table table1) и данные ( insert into table1... ).

Там мой косяк.
1052 Column 'number' in group statement is ambiguous

Неактивен

 

#15 30.10.2013 22:35:56

zhenia
Участник
Зарегистрирован: 30.10.2013
Сообщений: 7

Re: Посчитать разные значения.

vasya написал:


SELECT if(number LIKE '%444-55-60%','444-55-60',
if(number LIKE '%444-55-61%','444-55-61',
if(number LIKE '%444-55-62%','444-55-62',
if(number LIKE '%444-55-63%','444-55-63','444-55-64')))) as xxx, COUNT(*) FROM table1
    WHERE date BETWEEN '2013-09-01 00:00:00' AND '2013-09-30 23:59:59'
    AND (
           number LIKE '%444-55-60%'
        OR number LIKE '%444-55-61%'
        OR number LIKE '%444-55-62%'
        OR number LIKE '%444-55-63%'
                OR number LIKE '%444-55-64%'
        )
GROUP BY xxx;

 

ВОТ ЭТО ОНО. Спасибо огромное!
Правда ещё буду думать как бы "чуть" короче сделать + переменные.

PS:а вот "number" и вправду нужно поменять, а то сам запутаюсь.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson