Задавайте вопросы, мы ответим
Вы не зашли.
Доброго времени суток.
Нужно подсчитать и вывести количество номеров за определённыое количество времени.
Но (для меня) проблема заключается в том, что номера в таблице различаются.
Таблица одна, 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 ещё совсем зелёный, неделю только как начал "изучать".
Неактивен
Доброго времени суток.
Что является "основой" номера?
То естьКак из
Kiev-444-55-60 <044-2>
получить
444-55-60
?
Слева всегда находится kiev или как?
Неактивен
deadka написал:
Доброго времени суток.
Что является "основой" номера?
То естьКак из
Kiev-444-55-60 <044-2>
получить
444-55-60
?
В принципе да. Как подсчитать все записи в которых основа - допустим 444-55-60 + 444-55-61 + 444-55-62 +.....
И вывести "построчно"
deadka написал:
Слева всегда находится kiev или как?
Нет, там может быть и " и 'gorod' и 'poltava'
Неактивен
Вы должны знать какой-то механизм для "выкусывания" 444-55-60
из строки. regexpom или еще как - в общем, это должно быть автоматизировано.
Как предложите - можно будет и запрос составить.
Неактивен
deadka написал:
Вы должны знать какой-то механизм для "выкусывания" 444-55-60
из строки. regexpom или еще как - в общем, это должно быть автоматизировано.
Как предложите - можно будет и запрос составить.
А что с LIKE не так? Или под словом "выкусывать" имеется что-то другое, не пойму.
Мне нужно каким то образом суммировать определённые строки.
Я понимаю что я могу что-то не правильно и непонятно для вас излогать , но ввиду нубоватости в sql по другому пока не могу.
Неактивен
Неактивен
Ага, если исходить из того, что существуют только
444-55-60
444-55-61
444-55-62
444-55-63
, то можно так. Просто при добавлении нового - придется снова запрос модифицировать. Я думал что-то более универсальное сообразить, поэтому и спрашивал про методу выкусывания.
Неактивен
На самом деле номеров около 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 номеров....
Неактивен
Не совсем понял, чем Вам не подошёл запрос от vasya.
Если около 30, то действительно будет слишком длинный. Так что моя рекомендация в силе - формализуйте, как можно выкусить из середины поля непосредственно номер, по по которому хотите сгруппировать.
Cм. в сторону regexp,
substring,
locate.
Неактивен
Запрос от 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(общее кол-во) |
...
+-----------------------------------+----------------------+
Неактивен
Хм. Приведите структуру таблицы (show create table table1) и данные ( insert into table1... ).
Неактивен
deadka написал:
Хм. Приведите структуру таблицы (show create table table1) и данные ( insert into table1... ).
Не очень понятно что вы хотите увидеть. Я в первом посте написал(DESCRIBE), или этого не достаточно?
Таблица состоит из двух столбцов:
дата - номер
при этом номера внесены криво, но по семизначному номеру их можно сгруппировать.
Мне нужно сосчитать количество этих самих номеров у которых "корень" одинаков.
Неактивен
Неактивен
deadka написал:
Хм. Приведите структуру таблицы (show create table table1) и данные ( insert into table1... ).
Там мой косяк.
1052 Column 'number' in group statement is ambiguous
Неактивен
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" и вправду нужно поменять, а то сам запутаюсь.
Неактивен