Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2013, 17:52   #1
a.berkut
 
Регистрация: 11.11.2013
Сообщений: 6
Вопрос Три запроса к таблицам

Всем привет! Я создал БД с двумя таблицами, таблицы заполнил. Суть задания заключается в том, что фирма имеет несколько пунктов приема вторсырья. Каждый пункт получает деньги для их выдачи сдатчикам вторсырья. Сведения о получении денег на пунктах приема записываются в таблицу: Income (point, datepr, inc). Первичным ключом является (point, datepr). При этом в столбец datepr записывается только дата (без времени), т.е. прием денег (inc) на каждом пункте производится не чаще одного раза в день. Сведения о выдаче денег сдатчикам вторсырья записываются в таблицу: Outcome (point, datesd, out). В этой таблице также первичный ключ (point, datesd) гарантирует отчетность каждого пункта о выданных деньгах (out) не чаще одного раза в день. Здесь также значения столбца datesd не содержат времени.

Мои запросы:
Создаю БД:
Код:
CREATE DATABASE firma CHARACTER SET utf8 COLLATE utf8_general_ci;
Создаю таблицу income:
Код:
CREATE TABLE income (point TINYINT UNSIGNED NOT NULL COMMENT 'Код пункта приема', 
datepr DATE NOT NULL COMMENT 'Дата прихода', inc FLOAT NOT NULL COMMENT 'Полученные деньги', PRIMARY KEY (point, datepr));
Создаю таблицу outcome:
Код:
CREATE TABLE outcome (point TINYINT UNSIGNED NOT NULL COMMENT 'Код пункта приема', 
datesd DATE NOT NULL COMMENT 'Дата сдачи', outc FLOAT NOT NULL COMMENT 'Сумма выданных денежных средств сдатчику',
 PRIMARY KEY (point, datesd));
Заполняю таблицу income:
Код:
INSERT INTO income (point, datepr, inc) VALUES ('120', '2013-06-15', '400');
INSERT INTO income (point, datepr, inc) VALUES ('50', '2013-08-04', '150');
INSERT INTO income (point, datepr, inc) VALUES ('80', '2013-12-17', '500');
INSERT INTO income (point, datepr, inc) VALUES ('26', '2013-07-12', '1000');
INSERT INTO income (point, datepr, inc) VALUES ('86', '2013-09-01', '800');
INSERT INTO income (point, datepr, inc) VALUES ('20', '2013-12-12', '400');
INSERT INTO income (point, datepr, inc) VALUES ('74', '2013-02-19', '600');
INSERT INTO income (point, datepr, inc) VALUES ('25', '2013-01-08', '700');
Заполняю таблицу outcome:
Код:
INSERT INTO outcome (point, datesd, outc) VALUES ('120', '2013-06-15', '200');
INSERT INTO outcome (point, datesd, outc) VALUES ('50', '2013-08-04', '50');
INSERT INTO outcome (point, datesd, outc) VALUES ('80', '2013-12-17', '350');
INSERT INTO outcome (point, datesd, outc) VALUES ('26', '2013-07-12', '600');
INSERT INTO outcome (point, datesd, outc) VALUES ('86', '2013-09-01', '400');
INSERT INTO outcome (point, datesd, outc) VALUES ('20', '2013-12-12', '300');
INSERT INTO outcome (point, datesd, outc) VALUES ('74', '2013-02-19', '450');
INSERT INTO outcome (point, datesd, outc) VALUES ('25', '2013-01-08', '550');
Я не соображу, как правильно написать три запроса:
1. Запрос, который выводит все операции прихода и расхода из таблиц Income и Outcome в следующем виде: дата, пункт прихода, сумма прихода, пункт расхода, сумма расхода. При этом все операции прихода по всем пунктам упорядочены по полю point.
2. Из таблицы Outcome получить все записи за тот месяц (месяцы), с учетом года, в котором суммарное значение прихода (inc) - значение расхода (out) было максимальным.
3. По таблицам Income и Outcome для каждого пункта приема найти остатки денежных средств на конец каждого дня, в который выполнялись операции по приходу и/или расходу на данном пункте. Учесть при этом, что деньги не изымаются, а остатки/задолженность переходят на следующий день. Для решения задачи создать процедуру. Вывод: пункт приема, день в формате "dd/mm/yyyy", остатки/задолженность на конец этого дня.

Буду очень благодарен, если поможете составить эти три оставшихся запроса. Всем заранее большое спасибо!

Последний раз редактировалось Stilet; 12.11.2013 в 14:42.
a.berkut вне форума Ответить с цитированием
Старый 12.11.2013, 12:39   #2
a.berkut
 
Регистрация: 11.11.2013
Сообщений: 6
По умолчанию

Кто поможет?
a.berkut вне форума Ответить с цитированием
Старый 12.11.2013, 14:52   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
1. Запрос, который выводит все операции прихода и расхода из таблиц Income и Outcome в следующем виде: дата, пункт прихода, сумма прихода, пункт расхода, сумма расхода. При этом все операции прихода по всем пунктам упорядочены по полю point.
Код:
selet *
from income i
left join outcome o on i.point=o.point;
order by i.point
Остальные с ходу не соображу, отлаживать нужно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.11.2013, 14:56   #4
a.berkut
 
Регистрация: 11.11.2013
Сообщений: 6
По умолчанию

Спасибо большое, подожду остальное, если можно
a.berkut вне форума Ответить с цитированием
Старый 12.11.2013, 15:07   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Подожди. Просто я бы делал это не запросом а хранимой процедурой, потмоу так сразу и не соображу.
Может кто из SQLшиков месных и проведет ликбез.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.11.2013, 15:22   #6
a.berkut
 
Регистрация: 11.11.2013
Сообщений: 6
По умолчанию

Я тебя подожду, просто учитель сказал, что третье задание делается одним запросом, к примеру
a.berkut вне форума Ответить с цитированием
Старый 12.11.2013, 15:33   #7
a.berkut
 
Регистрация: 11.11.2013
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Подожди. Просто я бы делал это не запросом а хранимой процедурой, потмоу так сразу и не соображу.
Может кто из SQLшиков месных и проведет ликбез.
Тебе на заметку - с
Код:
ORDER BY i.point;
не работает, без него все правильно, все так, как и должно быть
a.berkut вне форума Ответить с цитированием
Старый 15.11.2013, 18:28   #8
a.berkut
 
Регистрация: 11.11.2013
Сообщений: 6
По умолчанию

Первое задание сделано, а второе и третье что-то никак

Код:
SELECT 
	o.point, 
        o.datesd, 
        o.outc,
        i.inc,
        i.datepr,
        SUM(i.inc) AS i.inc_sum,
        DISTINCT (i.inc_sum - o.outc) AS inc_pribil
FROM 
	outcome o
LEFT JOIN 
	income i 
ON 
	i.point = o.point
HAVING
(
	o.datesd > LAST_DAY( DATE_SUB( CURDATE( ) , INTERVAL 2 MONTH ) ) + INTERVAL 1 DAY 
AND  
	o.datesd < DATE_ADD( LAST_DAY( CURDATE( ) - INTERVAL 1 MONTH ) , INTERVAL 1 DAY )
)
AND
	YEAR(i.datepr) = YEAR(o.datesd)
AND 
	inc_pribil = MAX(inc_pribil);
Код:
SELECT
		td.datesd,
		td.outc,
		td.inc,
		td.datepr,
		(SUM(td.inc) - td.outc) AS pribil
FROM	
(	
SELECT DISTINCT
				point
			FROM
				(
					SELECT o.point FROM outcome o
						UNION ALL
					SELECT i.point FROM income i
				)
			AS
				points
)
AS 
	td
WHERE 
(
	td.datesd > ( LAST_DAY( DATE_SUB( CURDATE( ) , INTERVAL 2 MONTH ) ) + INTERVAL 1 DAY ) 
AND  
	td.datesd < DATE_ADD( LAST_DAY( CURDATE( ) - INTERVAL 1 MONTH ) , INTERVAL 1 DAY )
)
AND 
	YEAR(td.datepr) = YEAR(td.datesd)
AND
	pribil = MAX(pribil)	
GROUP BY 
	td.datesd,
	td.outc,
	td.inc,
	td.datepr,
	pribil;
Код:
SELECT DISTINCT
		point
FROM
(
	SELECT 
		*
	FROM 
		outcome
	WHERE
		datesd > ( LAST_DAY( DATE_SUB( CURDATE( ) , INTERVAL 2 MONTH ) ) + INTERVAL 1 DAY ) 
	AND  
		datesd < DATE_ADD( LAST_DAY( CURDATE( ) - INTERVAL 1 MONTH ) , INTERVAL 1 DAY )
	AND
		datesd = YEAR(datesd)
	AND
		(SELECT inc FROM income WHERE point = point) 
UNION ALL
	SELECT 
		*
	FROM 
		income
	WHERE
		(SELECT outc FROM outcome
)
AS 
	points;
Код:
SELECT DISTINCT 
			point
FROM
(
	SELECT 
		*
	FROM 
		outcome
	INNER JOIN 
		income 
	ON 
		income.point = outcome.point 
	HAVING
		outcome.datesd > ( LAST_DAY( DATE_SUB( CURDATE( ) , INTERVAL 2 MONTH ) ) + INTERVAL 1 DAY ) 
	AND  
		outcome.datesd < DATE_ADD( LAST_DAY( CURDATE( ) - INTERVAL 1 MONTH ) , INTERVAL 1 DAY )
	AND
		outcome.datesd = YEAR(outcome.datesd)
	AND 
		SUM(income.inc) - outcome.outc
UNION ALL
	SELECT 
		*
	FROM 
		income
)
AS 
	points;
a.berkut вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Игра в Delphi: «миссионеры и каннибалы»: На левом берегу реки находятся три миссионера и три каннибала. Нужно переправить всех Кристина25 Общие вопросы Delphi 0 07.10.2013 12:57
Даны три фамилии и три имени SmokeScreen Паскаль, Turbo Pascal, PascalABC.NET 1 17.06.2013 21:18
Как правильно объединить три простых запроса+ в один? NNvan SQL, базы данных 1 08.06.2010 00:04
как создать матрицу три на три в мемо (делфи) Lordigan Помощь студентам 0 15.03.2010 18:37
черный ящик, на три входа и на три выхода Shanson Помощь студентам 7 30.01.2008 09:45