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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2011, 06:09   #1
SAN-STR
Новичок
Джуниор
 
Регистрация: 27.09.2011
Сообщений: 5
Печаль Не получается написать запрос

День добрый, уважаемые форумчане!
/* Есть у меня к Вам приогромнейшая просьба, по написанию запросов, сам я работаю с SQL буквально 2 недели, по этому не помешал бы ваш совет. */
дано:
sql server 2008

Код:
--/////баланс по картам организаций/////--
declare @name nvarchar(255);
SET @name='ООО "Организация"';
declare @id numeric (3);
SET @id='5';
 
declare @balans numeric(19,2);
declare @popolnenie numeric(19,2);
declare @proezd numeric(19,2);
declare @bagaz numeric(19,2);
declare @Count_p int;
 
        --сумма пополнения
SELECT @popolnenie=(SUM(paymentSum))
        FROM payments
        JOIN [dbo].['CardsOfOrganizaition']
        ON [dbo].['CardsOfOrganizaition'].F4=[payments].idCard
        WHERE [dbo].['CardsOfOrganizaition'].F2=@name AND F3=@id AND paymentDate > '2009-12-20';
        
        --оплата за проезд и багаж, кол-во поездок
SELECT @proezd=( SUM(finalcost)), @bagaz=(SUM(bag_cost))
        FROM Rep_Main 
        JOIN [dbo].['CardsOfOrganizaition']
        ON [dbo].['CardsOfOrganizaition'].F4=[Rep_Main].ID_Card
        WHERE [dbo].['CardsOfOrganizaition'].F2=@name AND F3=@id AND paymentdate >'2010-01-01';
 
SELECT @balans=@popolnenie-@proezd-@bagaz;
 
SELECT @Count_p=(COUNT(*))
        FROM Rep_Main 
        JOIN [dbo].['CardsOfOrganizaition']
        ON [dbo].['CardsOfOrganizaition'].F4=[Rep_Main].ID_Card
        WHERE [dbo].['CardsOfOrganizaition'].F2=@name AND F3=@id AND paymentdate >'2010-01-01';
 
SELECT F2 AS 'Организация', F3 AS '№ карты', F4 AS 'ID карты', @balans AS 'Баланс карты', @Count_p AS 'Кол-во поездок', @popolnenie AS 'Сумма пополнения', @proezd AS 'За проезд', @bagaz AS 'За багаж'
        FROM cards
        JOIN [dbo].['CardsOfOrganizaition']
        ON [dbo].['CardsOfOrganizaition'].F4=cards.id_card
        WHERE [dbo].['CardsOfOrganizaition'].F2=@name AND F3=@id 
        ORDER BY F3
На что он мне отвечает:
Цитата:
Организация № карты ID карты Баланс карты Кол-во поездок Сумма пополнения За проезд За багаж
ООО "Организация" 5 8C7D8831 -54.00 562 3880.00 3934.00 0.00
Но вот проблем, в этой ООО "Организации" скажем карточек 200! Как мне вывести их все в одной таблице?) Изначально я делал выборку из БД без номера карт (@id) , но тогда он мне просто суммировал все данные в одну строку выводя что то вроде:
Цитата:
Организация № карты ID карты Баланс карты Кол-во поездок Сумма пополнения За проезд За багаж
ООО "Организация" 1 0C888B31 476.00 3504 25100.00 24624.00 0.00
ООО "Организация" 2 5C3A8931 476.00 3504 25100.00 24624.00 0.00
ООО "Организация" 3 3C298B31 476.00 3504 25100.00 24624.00 0.00
ООО "Организация" 4 8C8E8931 476.00 3504 25100.00 24624.00 0.00
ООО "Организация" 5 8C7D8831 476.00 3504 25100.00 24624.00 0.00
ООО "Организация" 6 0C5B8C31 476.00 3504 25100.00 24624.00 0.00
ООО "Организация" 7 8CAF9473 476.00 3504 25100.00 24624.00 0.00
ООО "Организация" 8 0C039A73 476.00 3504 25100.00 24624.00 0.00

Помогите пожалуйста разобраться! Понимаю, что сначала нужно учить язык, а уж потом писать запросы, но... все как всегда xDD череж жО) Заранее благодарен!

P.S. help me please

Последний раз редактировалось Stilet; 27.09.2011 в 07:56.
SAN-STR вне форума Ответить с цитированием
Старый 27.09.2011, 08:02   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Во-первых: Я бы не дублировал в запросе информацию не меняющуюся.
Зачем тебе поля баланса, кол-ва поездок и суммы если они одинаковы для всех записей изначально? Имеется ввиду зачем тебе эти данные в этом наборе, нельзя что-ли на два набора разбить?

Во-вторых:AND F3=@id как я понял из структуры исключает появление в наборе всех записей кроме той у которой ООО "Организация" 5 потому что SET @id='5';
Делай выводы - убери это условие из WHERE
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.09.2011, 08:33   #3
SAN-STR
Новичок
Джуниор
 
Регистрация: 27.09.2011
Сообщений: 5
По умолчанию

В том то и дело что эти записи несут в себе разную информацию, а если не конкретизировать ту или иную карту, например SET @id='5', то он выводит мне все мне нужные карты, но с неправильными данными... он их тупо суммирует и дублирует,
может есть роешение внести все это цикл? Где @id = @id+1 ??

Так Кажется решил проблему, только вот он мне по каждой карте выводит отдельную таблицу... вот связать бы все в одну...
кому поможет:
Код:
--/////баланс по картам организаций/////--
declare @name nvarchar(255);
set @name='ООО "Организация"';

	declare @balans numeric(19,2);
	declare @popolnenie numeric(19,2);
	declare @proezd numeric(19,2);
	declare @bagaz numeric(19,2);
	declare @Count_p int;
	declare @kal numeric (3);
	
select @kal =( MAX(F3))
From [dbo].['CardsOfOrganizaition']
Where [dbo].['CardsOfOrganizaition'].F2=@name
	
	declare @i int;
	set @i=1;

while  (@i <= @kal)
	begin
			--сумма пополнения
		select @popolnenie=(SUM(paymentSum))
			from payments
			JOIN [dbo].['CardsOfOrganizaition']
			ON [dbo].['CardsOfOrganizaition'].F4=[payments].idCard
			WHERE [dbo].['CardsOfOrganizaition'].F2=@name and F3=@i and paymentDate > '2009-12-20';
		
			--оплата за проезд и багаж, кол-во поездок
		Select @proezd=( SUM(finalcost)), @bagaz=(SUM(bag_cost))
			From Rep_Main 
			JOIN [dbo].['CardsOfOrganizaition']
			ON [dbo].['CardsOfOrganizaition'].F4=[Rep_Main].ID_Card
			WHERE [dbo].['CardsOfOrganizaition'].F2=@name and F3=@i and paymentdate >'2010-01-01';

		select @balans=@popolnenie-@proezd-@bagaz;

		Select @Count_p=(COUNT(*))
			From Rep_Main 
			JOIN [dbo].['CardsOfOrganizaition']
			ON [dbo].['CardsOfOrganizaition'].F4=[Rep_Main].ID_Card
			WHERE [dbo].['CardsOfOrganizaition'].F2=@name and F3=@i and paymentdate >'2010-01-01';

		select F2 as 'Организация', F3 as '№ карты', F4 as 'ID карты', @balans as 'Баланс карты',
 @Count_p as 'Кол-во поездок', @popolnenie as 'Сумма пополнения', @proezd as 'За проезд', @bagaz as 'За багаж'
			from cards
			JOIN [dbo].['CardsOfOrganizaition']
			ON [dbo].['CardsOfOrganizaition'].F4=cards.id_card
			WHERE [dbo].['CardsOfOrganizaition'].F2=@name and F3=@i 
			--group by F3
			order by F3
	set @i = @i+1
	end

Последний раз редактировалось Stilet; 27.09.2011 в 09:56.
SAN-STR вне форума Ответить с цитированием
Старый 27.09.2011, 10:02   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

изучайте вложенные запросы.

Код:
		select F2 as 'Организация'
, F3 as '№ карты'
, F4 as 'ID карты'
, popolnenie-proezd-bagaz as 'Баланс карты'
, Count_p as 'Кол-во поездок'
, popolnenie as 'Сумма пополнения'
, proezd as 'За проезд'
, bagaz as 'За багаж'
			from cards
			JOIN [dbo].['CardsOfOrganizaition']
			ON [dbo].['CardsOfOrganizaition'].F4=cards.id_card

LEFT JOIN ( 			--оплата за проезд и багаж, кол-во поездок
		Select SUM(finalcost) as proesd, SUM(bag_cost) as bagaz, COUNT(*) as count_p, ID_Card
			From Rep_Main 
			WHERE paymentdate >'2010-01-01'  
 group by ID_CARD
) rep2009 ON [dbo].['CardsOfOrganizaition'].F4=Rep2009.ID_Card

LEFT JOIN ( 			--сумма пополнения
		select SUM(paymentSum) as popolnenie, idCard
			from payments
			WHERE paymentDate > '2009-12-20'
group by IDCARD
) patments2009 ON [dbo].['CardsOfOrganizaition'].F4=payments2009.idCard

			WHERE [dbo].['CardsOfOrganizaition'].F2=@name ---and F3=@i 
			--group by F3
			order by F3
так годится?
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 27.09.2011 в 10:08.
evg_m вне форума Ответить с цитированием
Старый 27.09.2011, 11:06   #5
SAN-STR
Новичок
Джуниор
 
Регистрация: 27.09.2011
Сообщений: 5
По умолчанию

Да годится! Спасибо большое, вот что получилось в итоге:
Код:
declare @name nvarchar(255);
set @name='ООО "Организация"';	

	declare @balans numeric(19,2);
	declare @popolnenie numeric(19,2);
	declare @proezd numeric(19,2);
	declare @bagaz numeric(19,2);
	declare @Count_p int;
	declare @kol numeric (3);
		
		select F2 as 'Организация'
, F3 as '№ карты'
, F4 as 'ID карты'
, popolnenie-proesd-bagaz as 'Баланс карты'
, Count_p as 'Кол-во поездок'
, popolnenie as 'Сумма пополнения'
, proesd as 'За проезд'
, bagaz as 'За багаж'
			from cards
			JOIN [dbo].['CardsOfOrganizaition']
			ON [dbo].['CardsOfOrganizaition'].F4=cards.id_card

LEFT JOIN ( 			--оплата за проезд и багаж, кол-во поездок
		Select SUM(finalcost) as proesd, SUM(bag_cost) as bagaz, COUNT(*) as count_p, ID_Card
			From Rep_Main 
			WHERE paymentdate >'2010-01-01'  
 group by ID_CARD
) rep2009 ON [dbo].['CardsOfOrganizaition'].F4=Rep2009.ID_Card

LEFT JOIN ( 			--сумма пополнения
		select SUM(paymentSum) as popolnenie, idCard
			from payments
			WHERE paymentDate > '2009-12-20'
group by IDCARD
) payments2009 ON [dbo].['CardsOfOrganizaition'].F4=payments2009.idCard

			WHERE [dbo].['CardsOfOrganizaition'].F2=@name ---and F3=@i 
			--group by F3
			order by F3
а что такое?
Цитата:
payments2009
Это какая-то производная? -_- как правильно понять...
SAN-STR вне форума Ответить с цитированием
Старый 27.09.2011, 11:15   #6
SAN-STR
Новичок
Джуниор
 
Регистрация: 27.09.2011
Сообщений: 5
По умолчанию

Только вот это удалить еще..
Цитата:
declare @balans numeric(19,2);
declare @popolnenie numeric(19,2);
declare @proezd numeric(19,2);
declare @bagaz numeric(19,2);
declare @Count_p int;
declare @kol numeric (3);
SAN-STR вне форума Ответить с цитированием
Старый 27.09.2011, 16:03   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
а что такое?
Цитата:
payments2009
Это какая-то производная? -_- как правильно понять...
SAN-STR вне форума Добавить отзыв для SAN-STR Пожаловаться на это сообщение Ответить с цитированием
Это имя (alias) для вложенного запроса, которое используется для ссылок на поля этого запроса.

Код:
LEFT JOIN ( 			--сумма пополнения
		select SUM(paymentSum) as popolnenie, idCard
			from payments
			WHERE paymentDate > '2009-12-20'
group by IDCARD
) payments2009 ON [dbo].['CardsOfOrganizaition'].F4=payments2009.idCard
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 29.09.2011, 06:26   #8
SAN-STR
Новичок
Джуниор
 
Регистрация: 27.09.2011
Сообщений: 5
По умолчанию

Ok, сенк приогромный!)
SAN-STR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не получается правильно составить запрос XPath, Использую SelectSingleNode kolchakA Общие вопросы .NET 0 09.07.2010 17:32
Не получается запрос lola_lola SQL, базы данных 7 12.02.2010 12:45
Не получается выполнить запрос artemavd БД в Delphi 14 06.08.2009 20:44
не получается запрос с inner join :mad: Только_Учусь SQL, базы данных 16 21.07.2008 09:40