Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сводная таблица / 6 сообщений из 6, страница 1 из 1
08.05.2015, 14:58:54
    #38954712
PavelDAS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сводная таблица
Подскажите, как можно сделать такую таблицу:



нужен: год, состояние, количество
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Array
(
    [1976] => Array
    (
        [r] => 1
        [g] => 3
        [b] => 7
        [y] => 8
    )
    [1977] => Array
    (
        [r] => 1
        [g] => 3
        [b] => 7
        [y] => 8
    )
)



Таблица такая:
http://sqlfiddle.com/#!9/1b5ff/1
-------------
В текущем варианте в цикле перебираются числа с 1948 по 1992 и по каждому состоянию отправляется запрос.
Код: sql
1.
2.
3.
4.
SELECT count(id)
FROM table1
WHERE (status = 'g')
AND (nomer LIKE '".$year."%');
...
Рейтинг: 0 / 0
08.05.2015, 18:49:05
    #38954978
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сводная таблица
PavelDAS,

ну, про count вы уже знаете, осталось прочитать про group by.
...
Рейтинг: 0 / 0
11.05.2015, 11:38:52
    #38955631
PavelDAS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сводная таблица
tanglir,

про group by знаю, состояния перепишу.

А как быть с условиями вида:
Код: sql
1.
2.
3.
...
AND (nomer LIKE '1960%');
...


Код: sql
1.
2.
3.
...
AND (nomer LIKE '1961%');
...


Код: sql
1.
2.
3.
...
AND (nomer LIKE '1962%');
...


Код: sql
1.
2.
3.
...
AND (nomer LIKE '1963%');
...


Код: sql
1.
2.
3.
...
AND (nomer LIKE '1964%');
...


и так до 1992.
Можно как-то объединить в один запрос и чтобы этот год как-то получить
...
Рейтинг: 0 / 0
12.05.2015, 05:46:12
    #38956002
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сводная таблица
PavelDASМожно как-то объединить в один запрос и чтобы этот год как-то получитьМожно, и если бы вы действительно знали про групбай, то этот вопрос бы не возник.
...
Рейтинг: 0 / 0
12.05.2015, 14:18:38
    #38956480
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сводная таблица
tanglir, там не все так однозначно))
http://sqlfiddle.com/#!9/77803/1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT
  left(nomer,4) yr,
  sum(if(status='r',1,0))r,
  sum(if(status='g',1,0))g,
  sum(if(status='b',1,0))b,
  sum(if(status='y',1,0))y,
  COUNT(`Id`)total,
  round(COUNT(`Id`)*100.0/(select count(*) from Table1 where  `nomer` REGEXP '19[7-9][0-9]'),2)prc
FROM `Table1`
WHERE `nomer` REGEXP '19[7-9][0-9]'
GROUP BY left(nomer,4)
;
...
Рейтинг: 0 / 0
14.05.2015, 15:07:03
    #38958788
PavelDAS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сводная таблица
Решил своими силами так:
Код: sql
1.
2.
3.
4.
5.
SELECT substr(nomer,1,4) as year, status, count(id) as count
    FROM table1
    AND (substr(nomer,1,4) >= 1948)
    AND (substr(nomer,1,4) <= 1992)
    GROUP by substr(nomer,1,4), status



потом в массив и дополнение, если какого-то статуса не обнаружилось в table1 для года:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
while ($row = mysql_fetch_assoc($sql))
{
  $mas[$row['year']][$row['status']] = $row['count'];
}

foreach ($mas as $k => $v)
{
  if (count($v) < 4)
  {
    if (!(isset($v['g']))) $mas[$k]['g'] = 0;
    if (!(isset($v['y']))) $mas[$k]['y'] = 0;
    if (!(isset($v['b']))) $mas[$k]['b'] = 0;
    if (!(isset($v['b']))) $mas[$k]['r'] = 0;
  }
}



для записей, начинающихся с букв буду через регулярку.

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


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