Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > составной запрос


Автор: Diksa 15.9.2014, 14:26
Ребят подскажите возможно ли сделать такой запрос?

таблица в базе:
Код

id   |  idFlight  |  idWorks |     workedTime |  date
---------------------------------------------------------
1    |     25      | 1            |         60          | 2014-08-01
2    |     25      | 2            |         80          | 2014-08-01
3    |     45      | 1            |         55          | 2014-08-02
4    |     45      | 2            |         70          | 2014-08-02
5    |     25      | 1            |         40          | 2014-08-03




необходимо вывести сумму workedTime по числам, что-то на подобие этого

Код


id   |  idFlight  | workedTime |  date
---------------------------------------------------------
1    |     25      |         140     | 2014-08-01
3    |     45      |         125     | 2014-08-02
5    |     25      |         40       | 2014-08-03




 

Автор: Akina 15.9.2014, 14:30
RTFM "GROUP BY" & "SUM()"

Автор: Diksa 15.9.2014, 14:57
Эсли я правильно понял запрос должен иметь след. вид 

Код

select date, sum(workedTime), idflight from Karta  Group by (idFlight);


но результат получается не такой как мне надо :(

Код

id   |  idFlight  | workedTime |  date
---------------------------------------------------------
1    |     25      |         180     | 2014-08-01
3    |     45      |         125     | 2014-08-02


Автор: Akina 15.9.2014, 18:52
1) Неправильно понял.
2) Неправда - ты показываешь результат совсем другого запроса.

Автор: Diksa 16.9.2014, 10:38
результат выполнения запроса:

Код

select date, sum(workedTime), idflight from Karta  Group by (idFlight);


http://itmages.ru/image/view/1919181/acf2b5b5

видно что idFlight = 2 выводит за 2014-07-02 

а если посмотреть на данные то видно что есть и на 2014-07-03 и на 2014-07-04

http://itmages.ru/image/view/1919182/41b258b8


PS: Не могу понять зачем Вы тратите свое время, всеравно исходя из Вашего последнего ответа последуют следующие вопросы :(
или это так создается выдимость онлайна на этом форуме.

Автор: Akina 16.9.2014, 11:24
Цитата(Diksa @  16.9.2014,  11:38 Найти цитируемый пост)
Не могу понять 

Вопрос задан в тематическом разделе. Значит, автор желает не только увидеть, как, но и понять, почему именно так. Кроме того, предполагается, что он анализирует ответы и выполняет данные там рекомендации.
А те, кто приходят с желанием просто получить готовый ответ, должны обращаться не в тематические разделы, а в "Помощь студентам" или вообще во фриланс.

PS-1. Вы НЕ ЧИТАЛИ справку по GROUP BY. Либо читали её крайне невнимательно. Иначе видели бы, в чём принципиальная ошибка.
PS-2. Вы показываете запрос, выбирающий три поля, и вывод с четырьмя полями.

Автор: Diksa 16.9.2014, 15:18
Спасибо за помощь!

если кому пригодится ответ то запрос выглядит след убразом 

Код

SELECT sum(k.workedTime) as WT, date
FROM Karta k
WHERE idWorks <> 10 AND k.date LIKE '2014-08%' Group by(Date)  ORDER BY k.date;

Автор: Akina 16.9.2014, 15:59
Не очень хороший вид запроса. 

1) Поскольку таблица одна, алиасы имени таблицы можно не использовать. Либо, если использовать, то абсолютно везде. Если таблиц более одной - безусловно везде, даже если текущая структура позволяет вроде бы однозначно идентифицировать таблицу-источник какого-либо поля. Такая привычка убережёт от кучи ошибок в будущем.
2) В кляузе Group By нежелательно брать список полей группировки в скобки. Это может привести к лишним неявным преобразованиям типов.
3) При отборе по дате лучше использовать не Like (поскольку при этом выполняется преобразование даты в строку), а Between. Кстати, Like не позволит серверу использовать индекс, если таковой имеется.
4) Хоть в MySQL слово date не является зарезервированным, оно вполне может попасть в список в следующих версиях - уж больно популярное. Рекомендуется давать полям менее популярные имена.
5) В MySQL группировка одновременно означает и сортировку по тому же выражению, если не указан иной порядок сортировки. Кляуза Order By - лишняя.

К тому же запрос не отвечает начальным условиям темы.

Автор: Zloxa 16.9.2014, 17:05
Цитата(Akina @  16.9.2014,  16:59 Найти цитируемый пост)
 запрос не отвечает начальным условиям темы. 

Мне тоже так сначала показалось, но потом я перечел:
Цитата(Diksa @  15.9.2014,  15:26 Найти цитируемый пост)
необходимо вывести сумму workedTime по числам

И решил, что если под "числами" имеетя в виду "дата", то все же - соответствует.
Не соответствует контрольному примеру результирующего набора данных  smile, но там используется ключевое слово "вроде", легализующее всяческие допущения и опущения в том числе.

Автор: Akina 16.9.2014, 17:18
Цитата(Zloxa @  16.9.2014,  18:05 Найти цитируемый пост)
но потом я перечел

Обычно примеру я верю больше, чем описанию. В примере - тем более сравнительно аккуратно отформатированном,- ошибиться намного сложнее. Кроме того, каждой дате соответствует одно лишь значение имеющегося в выходном наборе поля idFlight. Но значение этого поля варьирует, что намекает на возможное соответствие одному значению date нескольких разных значений idFlight. И тогда о какой статистике речь, вообще неясно...

Впрочем, слишком уж простая задача вызвала затруднения - создалось впечатление, что это была неудачная попытка решить проблему кавалерийским наскоком без изучения даже самых основ. Потому ТС и был послан в STFW.

Автор: Diksa 17.9.2014, 15:11
БЛАГОДАРЮ за столь интересные розьяснения!

PS: Поскольку к такому способу решения задач обращаюсь крайне редко, признаю что задачу поставил не совсем корректно с некоторыми упущениями. Как-то привычнее гуглить до потери пульса, а тут решился, и собственно от этого процесса получил не весьма приятные впечатления, обидно :( 

Автор: Akina 17.9.2014, 15:52
Diksa, гуляние по граблям - это единственный способ НАДЁЖНОГО изучения предмета.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)