powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите создать запрос
15 сообщений из 15, страница 1 из 1
Помогите создать запрос
    #32190523
Alfa2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мускулем занялся недавно, поэтому много гллупых вопросов возникает...
Вопрос:

Есть несколько таблиц
# --------------------------------------------------------
# Хост: localhost
# Время создания: Июн 24 2003 г., 17:23
# Версия сервера: 4.00.13
# Версия PHP: 4.3.0
# БД : `n_b`
# --------------------------------------------------------

#
# Структура таблицы `antares`
#

CREATE TABLE antares (
data date NOT NULL default '2003-06-31',
gsm ENUM('А-95', 'А-92', 'А-80', 'А-76', 'Дт') NOT NULL,
prixod varchar(20) NOT NULL default '0,00',
rasxod varchar(20) NOT NULL default '0,00',
ostatok varchar(20) NOT NULL default '0,00',
KEY gsm (gsm)
) TYPE=MyISAM;

#
# Дамп данных таблицы `antares`
#

INSERT INTO antares VALUES ('2003-06-04', 'А-95', '0,00', '1000,00', '164475,00');
INSERT INTO antares VALUES ('2003-06-04', 'А-92', '0,00', '0,00', '157795,00');
INSERT INTO antares VALUES ('2003-06-04', 'А-80', '0,00', '0,00', '78769,60');
INSERT INTO antares VALUES ('2003-06-04', 'А-76', '0,00', '0,00', '497000,00');
INSERT INTO antares VALUES ('2003-06-04', 'Дт', '0,00', '0,00', '203245,00');
# --------------------------------------------------------

#
# Структура таблицы `bologoe`
#

CREATE TABLE bologoe (
data date NOT NULL default '2003-06-31',
gsm ENUM('А-76', 'Дт', 'Б-1') NOT NULL,
prixod varchar(20) NOT NULL default '0,00',
rasxod varchar(20) NOT NULL default '0,00',
ostatok varchar(20) NOT NULL default '0,00',
KEY gsm (gsm)
) TYPE=MyISAM;

#
# Дамп данных таблицы `bologoe`
#

INSERT INTO bologoe VALUES ('2003-06-05', 'Дт', '0,00', '17230,44', '139859,56');
INSERT INTO bologoe VALUES ('2003-06-05', 'А-76', '0,00', '0,00', '102233,00');
INSERT INTO bologoe VALUES ('2003-06-05', 'Б-1', '0,00', '0,00', '144600,00');
# --------------------------------------------------------

требуется вывести отчет (вот тут у меня есть проблемы ...)
суммировать поле rasxod из всех таблиц, но не просто,а по полю gsm
и вывести результаты отсортировав по полю data.

я уже голову всю сломал, как ...
не дайте умереть, помоготи кто, чем может ...
...
Рейтинг: 0 / 0
Помогите создать запрос
    #32190578
Stellar.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все неправильно. В корне.
У тебя 2 абослютно одинаковые таблицы . Зачем хранить одинаковые данные в таблицах?
Так никто не делает.
делают так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
CREATE TABLE fuel_types(
  id   int not null,
  name varchar( 5 ),
  primary key(id)
);

CREATE TABLE cities(
   id   int not null auto_increment,
   name varchar( 255 ),
   primary key(id)
);

CREATE TABLE fuel_usage_stats(
  id            int not null auto_increment,
  ctime         datetime,
  fuel_types_id int not null,
  cities_id     int not null,
  prihod        int not null,
  rashod       int not null,
  primary key (id)
);

SELECT
  fuel_types_id, SUM(rashod)
FROM
  fuel_usage_stats
GROUP BY fuel_types_id
ORDER BY ctime;  -- Выбираем сумму по всем городам,
 
                        -- с группировкой по типу топлива
 
...
Рейтинг: 0 / 0
Помогите создать запрос
    #32190591
Stellar.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В запросе - ошибка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
надо так:
SELECT
  fuel_types_id, SUM(rashod)
FROM
  fuel_usage_stats
GROUP BY fuel_types_id, ctime
ORDER BY ctime; 


Ну и данные туда.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
INSERT INTO fuel_types VALUES( 1 , 'А-95');
INSERT INTO fuel_types VALUES( 2 , 'А-92');
INSERT INTO fuel_types VALUES( 3 , 'А-80');
INSERT INTO fuel_types VALUES( 4 , 'А-76');
INSERT INTO fuel_types VALUES( 5 , 'Дт');

INSERT INTO cities (name) VALUES ('Антарес');
INSERT INTO cities (name) VALUES ('Бологое');
INSERT INTO cities (name) VALUES ('Норильск');


INSERT INTO fuel_usage_stats (ctime, fuel_types_id, cities_id, prihod, rashod)
VALUES (NOW(),  1 ,  2 ,  20000 ,  10000 );


...
Рейтинг: 0 / 0
Помогите создать запрос
    #32190595
Stellar.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, и создание таблиц без первичного ключа - отвратительно.
...
Рейтинг: 0 / 0
Помогите создать запрос
    #32191138
Alfa2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
с созданием таблиц разобрался, а вот с выводом результатов не очень

Твой запрос

SELECT
fuel_types_id, SUM(rashod)
FROM
fuel_usage_stats
GROUP BY fuel_types_id, ctime
ORDER BY ctime

выведет строки вида

I гсм I Расход I
-----------------
I 1 I 1000,00 I
-----------------
I 2 I 500,00 I
------------------

Добавим ctime

SELECT
ctime, fuel_types_id, SUM(rashod)
FROM
fuel_usage_stats
GROUP BY fuel_types_id, ctime
ORDER BY ctime

получим

I дата I гсм I Расход I
------------------------------
I 2003-06-07 I 1 I 1000,00 I
------------------------------
I 2003-06-07 I 2 I 500,00 I
------------------------------

Происходит вывод не суммы, а всех записей, или я что-то не понял ???

Или может я плохо сформулировал вопрос:

суммировать поле rasxod всех городов (cities.name),
по полю fuel_types.name
и вывести результаты отсортировав по полю fuel_usage_stats.ctime.

результат должен выглядить примено так:

I дата I гсм I Расход I
------------------------------
I 2003-06-07 I А-95 I 1000,00 I
------------------------------
I 2003-06-07 I А-92 I 500,00 I
------------------------------
I 2003-06-08 I А-95 I 200,00 I
...
Рейтинг: 0 / 0
Помогите создать запрос
    #32191183
Stellar.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT 
ctime, fuel_types_id, SUM(rashod) 
FROM 
fuel_usage_stats 
GROUP BY fuel_types_id, ctime, cities_id
ORDER BY ctime

При этом сделай поле ctime типом DATE.
...
Рейтинг: 0 / 0
Помогите создать запрос
    #32191247
Alfa2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Заработало!!!!!!!!

только по условию вывода вот так

SELECT
ctime, fuel_types_id, SUM(rashod)
FROM
fuel_usage_stats
GROUP BY fuel_types_id, ctime
ORDER BY ctime

что надо "покрутить", чтоб вместо цифирного fuel_usage_stats.fuel_types_id выдавался fuel_types.name

т.е. не 1 , 2 , 3 ... , а А-95, А-92, А-80 ...
...
Рейтинг: 0 / 0
Помогите создать запрос
    #32191310
Stellar.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А самому подумать?
Подумать порядка 10 - 20 секунд.
И почитать про пересесения таблиц.
...
Рейтинг: 0 / 0
Помогите создать запрос
    #32191313
BigHarry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT ctime, fuel_types.name, SUM(rashod)
FROM fuel_usage_stats, fuel_types
WHERE fuel_types.id = fuel_usage_stats.fuel_types_id
GROUP BY fuel_types_id, ctime
ORDER BY ctime
...
Рейтинг: 0 / 0
Помогите создать запрос
    #32191332
Stellar.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SELECT ctime, fuel_types.name, SUM(rashod)
FROM fuel_usage_stats, fuel_types
WHERE fuel_types.id = fuel_usage_stats.fuel_types_id
GROUP BY fuel_types_id, ctime, fuel_types.name
ORDER BY ctime;
...
Рейтинг: 0 / 0
Помогите создать запрос
    #32191340
BigHarry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем дополнительная группировка по наименованиею (fuel_types.name) ?
Вроде - по fuel_types_id будет достаточно...
...
Рейтинг: 0 / 0
Помогите создать запрос
    #32191364
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2BigHarry, потому что это только в MySQL возможно выбирать поля по которым не происходит группировка. Он в этом случае берет одно из нескольких значений наабум. А так всегда эти поля перечисляют в GROUP BY
...
Рейтинг: 0 / 0
Помогите создать запрос
    #32191426
Alfa2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем большое спасибо!

теперь может бухгалтерия оставят меня в покое на денек ...

2Stellar

Обязательно еще почитаю, просто я ентого еще не понял, а "Бух" ногами топает результат ему давай, типа работа стоит.
...
Рейтинг: 0 / 0
Помогите создать запрос
    #32192009
BigHarry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>Он в этом случае берет одно из нескольких значений наабум.
>>А так всегда эти поля перечисляют в GROUP BY

Почему наобум? Это-же по сути - обычное объедиенние - и любой SQL-сервер должен выдавать нормально, без дополнительной группировки. Группировка - она для функций, а тут - обычная связь...
...
Рейтинг: 0 / 0
Помогите создать запрос
    #32192076
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2BigHarry, если в таблице есть 4 поля, ты группируешь по двум из них, то к другим двум, если ты их хочешь показывать, ты должен применить одну из агригирующих функций.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
cur_rate
+ -----+------------+------+
 
| CUR | Date       | Rate |
+ -----+------------+------+
 
| RUR |  21 . 06 . 2003  |  30 . 5  |
| RUR |  22 . 06 . 2003  |  31 . 6  |
| USD |  21 . 06 . 2003  |   2 . 5  |
| USD |  22 . 06 . 2003  |   3 . 5  |
| EUR |  21 . 06 . 2003  |   1 . 5  |

SELECT a.CUR, a.Date, a.Rate
FROM cur_rate
GROUP BY a.CUR

На твой взгляд, что выдаст скрипт, и на каком основании? На MySQL этот скрипт отработает, а вот на Oracle или MS SQL - НЕТ!
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите создать запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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