Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вывод значений двух таблиц в общую таблицу  [new]
eleau
Member

Откуда:
Сообщений: 11
Есть таблица клиента:

Create table Klient
(
	nomer_klienta int not Null Primary Key ,
	familia varchar(20),
	imya varchar(20),
	otchestvo varchar(20)
);


Таблица материалов (песчаный замок, например, каменная плитка)

Create table Materials
(	
	Kod_materiala int not Null Primary Key,
	Kod_Type_materiala int not Null,
	Nazvanie_materiala varchar(20) not Null,
	CONSTRAINT FK_Materials_Type_materiala 
		FOREIGN KEY (Kod_type_materiala) REFERENCES Type_materiala(Kod_type_materiala)
);


Таблица типов материала (тип материала может быть или камень или песок)

Create table Type_materiala 
(
	Kod_type_materiala int not Null Primary Key,
	Nazvanie_type_materiala varchar(20) not Null default 'pesok',
	UNIQUE (Nazvanie_type_materiala ),
	CHECK (Nazvanie_type_materiala IN ('pesok', 'kamen'))
);


и таблица сделок с клиентами

Create table Sdelki
(
	Kod_sdelki int not Null Primary Key,
	nomer_klienta int not Null,
	CONSTRAINT FK_Sdelki_Klient
		FOREIGN KEY (nomer_klienta ) REFERENCES Klient(nomer_klienta ),
	kolichestvo real CHECK (kolichestvo>0),

	Kod_materiala int not Null,
	CONSTRAINT FK_Sdelki_Materials
		FOREIGN KEY (Kod_materiala ) REFERENCES Materials(Kod_materiala ),

	Kod_type_materiala int not Null,
	CONSTRAINT FK_Sdelki_Kod_type_materiala 
		FOREIGN KEY (Kod_type_materiala ) REFERENCES Materials(Kod_type_materiala ),

	napravlenie_sdelki varchar(10) not Null default 'long' 
		CHECK (napravlenie_sdelki IN ('long', 'short')),
	zena_otkrytiya money CHECK (zena_otkrytiya>0),
	zena_zakrytiya money CHECK (zena_zakrytiya>0),
	pribyl as 
		case 
			when napravlenie_sdelki = 'long' then 
				(zena_zakrytiya-zena_otkrytiya)*kolichestvo
				else (zena_otkrytiya-zena_zakrytiya)*kolichestvo
		end
);


Как сделать, чтобы создалась одна таблица с двумя колонками ('pesok', 'kamen'), в которые записывались 3 самых прибыльных песочных материала и топ 3 каменных соответственно у такого-то клиента??

Сломал голову, один бред получается
SELECT TOP(3) familia, Nazvanie_type_materiala as 'pesok', Nazvanie_type_materiala as 'kamen', pribyl FROM Sdelki
inner join Materials ON Sdelki.Kod_materiala = Materials.Kod_materiala
inner join Klient ON Sdelki.nomer_klienta = Klient.nomer_klienta
inner join Type_materiala ON Sdelki.Kod_type_materiala = Type_materiala.Kod_type_materiala
ORDER BY pribyl DESC

Никакие из полей таблиц не лишние, убирать ничего нельзя, просто сделать из этого таблицу из двух колонок (песок и камень), в которые выводить по три самых прибыльных изделия для каждого клиента (клиент получается третья колонка, или первая)

Буду очень признателен за помощь
15 июн 19, 16:45    [21909134]     Ответить | Цитировать Сообщить модератору
 Re: Вывод значений двух таблиц в общую таблицу  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36926
eleau
Как сделать, чтобы создалась одна таблица с двумя колонками ('pesok', 'kamen'),

create table ...
eleau
в которые записывались 3 самых прибыльных песочных материала и топ 3 каменных соответственно у такого-то клиента??

insert into ... select ...

Сообщение было отредактировано: 15 июн 19, 17:43
15 июн 19, 17:43    [21909144]     Ответить | Цитировать Сообщить модератору
 Re: Вывод значений двух таблиц в общую таблицу  [new]
aleks222
Member

Откуда:
Сообщений: 926
Гавриленко Сергей Алексеевич
eleau
Как сделать, чтобы создалась одна таблица с двумя колонками ('pesok', 'kamen'),

create table ...
eleau
в которые записывались 3 самых прибыльных песочных материала и топ 3 каменных соответственно у такого-то клиента??

insert into ... select ...


Зачем именно таблица?

with t as ( select *, n = row_number() over(partition by nomer_klienta, Kod_type_materiala  order by pribyl desc ) from Sdelki )
   , x as ( select nomer_klienta, Kod_type_materiala, Kod_materiala, n from t where n between 1 and 3 )
   , m as ( select Kod_type_materiala from Type_materiala where Nazvanie_type_materiala = 'pesok' )
   , p as ( select * from x where Kod_type_materiala = ( select Kod_type_materiala from m) )
   , k as ( select * from x where Kod_type_materiala <> ( select Kod_type_materiala from m) )
   select p.*, k.*
     from p full outer join k on p.nomer_klienta = k.nomer_klienta and p.n = k.n
15 июн 19, 18:09    [21909149]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить