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

Откуда:
Сообщений: 19
Здравствуйте, есть БД (Отрывок на фото), пишу хранимую процедуру которая ищет по определенным параметрам и генерирую отчет в C#. проблема в следующем: мне надо что бы генерировало как в варианте 1 а сейчас генерируется как во 2 варианте. Кто знает как сделать? или это уже надо в win forme делать ?


Хранимая процедура:

USE [Lombard]
GO
/****** Object:  StoredProcedure [dbo].[YVD]    Script Date: 11.02.2019 11:06:24 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[YVD] @dataot NVARCHAR(10), @datado NVARCHAR(10) 
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
select t_pledge.data, t_subject.name_subject, t_subject.comments, 
(t_person.surname+' '+t_person.name+' '+t_person.patronymic) as thisclient, 
(t_document.tip_documenta+': '+t_document.series+' '+t_document.number+', '+t_document.issued) as doc,
 t_meta_property.name_meta_property, t_property.value
FROM t_subject 
JOIN t_pledge ON t_pledge.id_pledge=t_subject.id_pledge
JOIN t_person ON t_person.id_person=t_pledge.id_client
JOIN t_document ON t_document.id_document=t_pledge.id_document
JOIN t_property ON  t_property.id_subject=t_subject.id_subject
JOIN t_meta_property ON t_meta_property.id_meta_property=t_property.id_meta_property
WHERE t_subject.status='В залоге' AND t_pledge.data>@dataot AND t_pledge.data<@datado
END


К сообщению приложен файл. Размер - 146Kb
11 фев 19, 06:28    [21806026]     Ответить | Цитировать Сообщить модератору
 Re: Организация вывода взаимосвязных таблиц в одну  [new]
court
Member

Откуда:
Сообщений: 1646
BF_KARATEL
или это уже надо в win forme делать ?
Собственно, в любой уважающей себя отчетной системе есть опция для вывода в поле "скрывать повтор" (или как-то так)

Но если стоит задача "погреть сервер" сделать именно на сервере, то проще всего как-то так:

;with cte as (
	select t_pledge.data, t_subject.name_subject, t_subject.comments, 
	(t_person.surname+' '+t_person.name+' '+t_person.patronymic) as thisclient, 
	(t_document.tip_documenta+': '+t_document.series+' '+t_document.number+', '+t_document.issued) as doc,
	 t_meta_property.name_meta_property, t_property.value
	 ,rn	=row_number()over(partition by t_pledge.data, t_subject.name_subject, t_subject.comments,(t_person.surname+' '+t_person.name+' '+t_person.patronymic) order by t_meta_property.name_meta_property, t_property.value)
	FROM t_subject 
	JOIN t_pledge ON t_pledge.id_pledge=t_subject.id_pledge
	JOIN t_person ON t_person.id_person=t_pledge.id_client
	JOIN t_document ON t_document.id_document=t_pledge.id_document
	JOIN t_property ON  t_property.id_subject=t_subject.id_subject
	JOIN t_meta_property ON t_meta_property.id_meta_property=t_property.id_meta_property
	WHERE t_subject.status='В залоге' AND t_pledge.data>@dataot AND t_pledge.data<@datado)

select 
	data			=case when rn=1 then data end
	,name_subject	=case when rn=1 then name_subject end
	,comments		=case when rn=1 then comments end
	,thisclient		=case when rn=1 then thisclient end
	,doc			=case when rn=1 then doc end
	,name_meta_property
	,value
from cte 
order by data, name_subject, comments, thisclient, rn
11 фев 19, 10:54    [21806152]     Ответить | Цитировать Сообщить модератору
 Re: Организация вывода взаимосвязных таблиц в одну  [new]
BF_KARATEL
Member

Откуда:
Сообщений: 19
court,
court
,rn =row_number()over(partition by t_pledge.data, t_subject.name_subject, t_subject.comments,(t_person.surname+' '+t_person.name+' '+t_person.patronymic) order by t_meta_property.name_meta_property, t_property.value)


Вы получается здесь используете обобщенное табличное выражение в котором переменной rn присваиваете номер возвращаемый функцией row_number которая нумерует строки при этом конструкцией PARTITION BY вы задает группы строк, для которых выполняется независимая нумерация с сортировкой по полям t_meta_property.name_meta_property, t_property.value Верно ?

(Просто sql не так сильно изучал)
11 фев 19, 12:18    [21806243]     Ответить | Цитировать Сообщить модератору
 Re: Организация вывода взаимосвязных таблиц в одну  [new]
court
Member

Откуда:
Сообщений: 1646
BF_KARATEL
court,
court
,rn =row_number()over(partition by t_pledge.data, t_subject.name_subject, t_subject.comments,(t_person.surname+' '+t_person.name+' '+t_person.patronymic) order by t_meta_property.name_meta_property, t_property.value)


Вы получается здесь используете обобщенное табличное выражение в котором переменной rn присваиваете номер возвращаемый функцией row_number которая нумерует строки при этом конструкцией PARTITION BY вы задает группы строк, для которых выполняется независимая нумерация с сортировкой по полям t_meta_property.name_meta_property, t_property.value Верно ?

(Просто sql не так сильно изучал)
да, всё более-менее так
(только rn не переменная, а доп.поле формируемое в CTE)
11 фев 19, 12:23    [21806251]     Ответить | Цитировать Сообщить модератору
 Re: Организация вывода взаимосвязных таблиц в одну  [new]
BF_KARATEL
Member

Откуда:
Сообщений: 19
court,

Спасибо большое!!! наверное в каком нибудь далеком будущем я смогу так же как вы писать на sql, но это не точно =), а так если не секрет сколько лет у вас стажа в SQL и реально ли вы его переменяет в работе ?
11 фев 19, 12:31    [21806267]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить