[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: SQL-запрос
Страницы: 1, 2, 3
chee
Как я понял ТС хочет вывести информацию с количеством воды за каждый из указанных периодов.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
sergeiss
Цитата (chee @ 4.06.2014 - 22:22)
Как я понял ТС хочет вывести информацию с количеством воды за каждый из указанных периодов.

Может быть и так, но лучше пусть ТС сам озвучит свои "хотелки".

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
chee
а он уже писал

Цитата (Skesh @ 4.06.2014 - 14:54)
я приследую цель: сума ячеек с определенных периодов, которых может быть N в одной или нескольких таблицах.



_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
sergeiss
Да, chee, ты прав :) Не заметил.

Цитата (Skesh @ 4.06.2014 - 14:54)
цель: сума ячеек с определенных периодов, которых может быть N в одной или нескольких таблицах

Разве что только не "сумА", а "сумма" нужна...

Я бы так сделал (напишу схему запроса, пусть ТС сам немного доделает).
Алгоритм:
1. Делаем подзапрос, выбирающий нужные данные за нужный период изо всех искомых таблиц. Можно использовать ЮНИОН для выборки с разных таблиц!!! Заодно вводим дополнительную колонку, уникальную для каждого периода времени. Например, в формате "год-месяц". В условиях по времени берем начало первого искомого периода и конец последнего периода.
2. Группируем по той уникальной колонке, вычисляем сумму (или суммы).

select <набор колонок>, SUM(...) as ...., SUM(...) as ..., year_month
from

(select <набор нужных колонок>, <колонка в формате "год-месяц", на основе даты> as year_month
from
<имя таблицы>
where <условия>
union
...
)
subquery

group by year_month
order by year_month



Важно:
А вообще, у меня есть подозрение, что ТС не нужно много таблиц использовать "с идентичными полями". Лучше сделать одну таблицу и разбить ее на партиции, по критерию "год". Если данных совсем много, то по критерию "год и месяц". Тогда хоть за 100 лет данные наберутся, не надо будет с ЮНИОН мудрить.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Valick
Цитата
ТС не нужно много таблиц использовать "с идентичными полями"

боюсь это не самое страшное в организации БД

_____________
Стимулятор ~yoomoney - 41001303250491
Skesh
На выходе я хочу получить вот такой массив
user posted image

_____________
*пускает слюну, глядя на код* :)
Skesh
Цитата
А вообще, у меня есть подозрение, что ТС не нужно много таблиц использовать "с идентичными полями". Лучше сделать одну таблицу и разбить ее на партиции, по критерию "год". Если данных совсем много, то по критерию "год и месяц"

К сожелению нужно много таблиц с идентичными полями. Как разбить на партиции по принципу с (год1-месяц1-день1) по (год2-месяц2-день2) ну по периодах в смысле? и что то я не пойму, в вашем примере все равно присутствует union так в чем отличие от моего?
Цитата
уникальную для каждого периода времени

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

_____________
*пускает слюну, глядя на код* :)
sergeiss
Цитата (Skesh @ 5.06.2014 - 17:05)
в вашем примере все равно присутствует union так в чем отличие от моего?

Ни в чем smile.gif Этот каркас запроса был сделан именно под твою структуру таблиц. Но если будешь использовать партиции, то никакой ЮНИОН не понадобится - хотя всё остальное в запросе сохранится.

Цитата (Skesh @ 5.06.2014 - 17:05)
Цитата
уникальную для каждого периода времени

так не пойдет,....

У меня подозрение, что ты меня не понял. Дата у тебя для каждой записи есть? Есть. Ну так выбери из неё "год-месяц", помести в отдельный столбец в выборке, это и будет уникальный идентификатор для периода времени! Группируй по нему и любым другим признакам.
Делай это только в момент выборки, ничего в данных менять не нужно.

Цитата (Skesh @ 5.06.2014 - 17:05)
К сожалению нужно много таблиц с идентичными полями. Как разбить на партиции по принципу...

Не нужно тебе много таблиц с идентичными полями. Нужно именно партиции.

Что такое партиции и как с ними работать: https://www.google.ru/search?client=opera&q...=UTF-8&oe=UTF-8

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Skesh
sergeiss ставлю пиво за пример (100 р. на вебмани кошелек), только на основе
вот этого кода:
(SELECT `kategory`, `subkategory`, MAX(`samedate`) as `samedate`, SUM(`electro`) as `electro`, SUM(`voda`) as `voda` FROM `actual_2014_ev2` 
WHERE (`kategory`='Культура' AND `subkategory`='МПК' AND date(`samedate`)>=date('2013-12-15') AND date(`samedate`)<=date('2014-1-15')) )
UNION
(SELECT `kategory`, `subkategory`, MAX(`samedate`) as `samedate`, SUM(`electro`) as `electro`, SUM(`voda`) as `voda` FROM `actual_2014_ev2`
WHERE (`kategory`='Культура' AND `subkategory`='МПК' AND date(`samedate`)>=date('2013-1-15') AND date(`samedate`)<=date('2014-2-15')) )
UNION
(SELECT `kategory`, `subkategory`, MAX(`samedate`) as `samedate`, SUM(`electro`) as `electro`, SUM(`voda`) as `voda` FROM `actual_2014_ev2`
WHERE (`kategory`='Культура' AND `subkategory`='МПК' AND date(`samedate`)>=date('2013-2-15') AND date(`samedate`)<=date('2014-3-15')) )
UNION
(SELECT `kategory`, `subkategory`, MAX(`samedate`) as `samedate`, SUM(`electro`) as `electro`, SUM(`voda`) as `voda` FROM `actual_2014_ev2`
WHERE (`kategory`='Культура' AND `subkategory`='МПК' AND date(`samedate`)>=date('2013-3-15') AND date(`samedate`)<=date('2014-4-15')) )


таблица:
CREATE TABLE `actual_2011_ev2` (
`inc` int(11) NOT NULL AUTO_INCREMENT,
`kategory` text,
`subkategory` text,
`samedate` date DEFAULT NULL,
`electro` double(24,5) unsigned DEFAULT NULL,
`voda` double(24,5) unsigned DEFAULT NULL,
`g_voda` double(24,5) unsigned DEFAULT NULL,
`gas` double(24,5) unsigned DEFAULT NULL,
`teplo` double(24,5) unsigned DEFAULT NULL,
`ugol` double(24,5) unsigned DEFAULT NULL,
`drova` double(24,5) unsigned DEFAULT NULL,
`vadhody_derevo` double(24,5) unsigned DEFAULT NULL,
`torf` double(24,5) unsigned DEFAULT NULL,
`torfobryket` double(24,5) unsigned DEFAULT NULL,
`pylety` double(24,5) unsigned DEFAULT NULL,
PRIMARY KEY (`inc`),
KEY `samedate` (`samedate`)
)
ENGINE=MyISAM AUTO_INCREMENT=2864 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
ну и таких таблиц много отличие только в названии по годам, ну и данные соответственно за данный год записываются.

Еще вопрос, в чем погрешность моего варианта?

_____________
*пускает слюну, глядя на код* :)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.