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

Откуда: Левый берег
Сообщений: 392
Здравствуйте !
Подскажите как сделать выборку из таблицы #T
Есть набор
create TABLE #T (EmpID INT, Name VARCHAR(50), Div  VARCHAR(50))

insert #T values
	(1,'Иванов','отдел')
	,(2,'Петров','отдел')
	,(3,'Сидоров','отделение')
	,(4,'Егоров','отделение')
	,(5,'Серегин','группа')
	,(6,'Васькин','группа')

select * from #T

drop table #T


чтобы получить вот такой результат

EmpIDName Div
nullотделnull
1Ивановотдел
2Петровотдел
nullотделениеnull
3Сидоровотделение
4Егоровотделение
nullгруппаnull
5Серегингруппа
6Васькингруппа


Спасибо ...
9 дек 13, 18:38    [15266675]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5489
Название отдела нужно перед списком его сотрудников? Это обязательно надо в одну таблицу?
9 дек 13, 19:27    [15266914]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
o-o
Guest
о какая кака!
declare @t TABLE (EmpID INT, Name nVARCHAR(50), Div  nVARCHAR(50))

insert @T values
	(1,N'Иванов',N'отдел')
	,(2,N'Петров',N'отдел')
	,(3,N'Сидоров',N'отделение')
	,(4,N'Егоров',N'отделение')
	,(5,N'Серегин',N'группа')
	,(6,N'Васькин',N'группа')


with cte as(
select distinct -1 as EmpID,
                div,
                div as name
from @T
),
t_ord as
(select empID, name, div, div as div_ord
from @T),

tmp as(
select empID, name, div, div_ord
from t_ord
union all 
select nullif(-1, empID), name, nullif(div, name), div
from cte)

select empID, name, div
from tmp
order by div_ord, empID
--------------------------------
empID	name	div
NULL	группа	NULL
5	Серегин	группа
6	Васькин	группа
NULL	отдел	NULL
1	Иванов	отдел
2	Петров	отдел
NULL	отделение	NULL
3	Сидоров	отделение
4	Егоров	отделение
9 дек 13, 19:54    [15267021]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
Алексаша
Member

Откуда: Левый берег
Сообщений: 392
Dmitry V. Liseev,

не обязательно, нужно чтоб шапка была так сказать
9 дек 13, 20:44    [15267185]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
sdet
Member

Откуда:
Сообщений: 463
Алексаша,
;with t as
(select EmpID,Name,Div from 	#T
union
select null EmpID,Div Name,null Div from #T
)
select * from t
order by  case when EmpID is null then Name else Div end,Div
9 дек 13, 21:35    [15267326]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
kikki
Member

Откуда: киккятница
Сообщений: 20681
а почему вы не используете сводную таблицу Эксель? это красиво бы выглядело в сводной таблице, и такой сложный запрос строить не надо было бы, а отсортировано там было бы так же
10 дек 13, 06:16    [15268251]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
Jaffar
Member

Откуда:
Сообщений: 633
declare @t TABLE (EmpID INT, Name nVARCHAR(50), Div  nVARCHAR(50))

insert @T values
	(1,N'Иванов',N'отдел')
	,(2,N'Петров',N'отдел')
	,(3,N'Сидоров',N'отделение')
	,(4,N'Егоров',N'отделение')
	,(5,N'Серегин',N'группа')
	,(6,N'Васькин',N'группа')


select EmpID, Name, Div
from (
--- берем всех
select *, EMPID OrderBy from @T
union all
--- берем отделы и для каждого отдела берем min ID сотрудника и вычитаем из него 0.1 - потом по этоу полю будем сортировать
--- если бы нужно было поместить отдел в конец  - то брали бы max ID и добавляли 0.1
select NULL, DIV, NULL, cast(min(EMpID) as money) - 0.1 OrderBy from @T group by DIV /**/) t
order by OrderBy asc
kikki,

хотя наверное этот вариант очень уж архоичен и олдфажен и так уже никто не пишет.
щас CTE в моде.
10 дек 13, 07:02    [15268287]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
kikki
Member

Откуда: киккятница
Сообщений: 20681
Jaffar,

«такой» = какой?

Что архаично: тот способ, который я предлагаю, или тот, которым предлагаете сделать вы или ещё кто-то в этой теме?
10 дек 13, 07:41    [15268312]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
Алексаша,

В общем чотта такое получилось )))))
WITH rec AS (
	select distinct 
		convert(int,NULL) EmpID,
		Div Name,
		convert(varchar(50),NULL) Div
	from #T
	UNION ALL
	SELECT t.EmpID, t.NAME, t.Div
	FROM #T t JOIN rec r ON r.Name = t.Div
)
SELECT *
FROM rec
ORDER BY
	CASE
		WHEN Div IS NULL THEN NAME
		ELSE Div
	END, Div
10 дек 13, 10:26    [15269016]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
kikki
Member

Откуда: киккятница
Сообщений: 20681
Вообще это можно и без курсора сделать. Мне просто сейчас неохота это делать с парой подзапросов. Может, захочу и тогда напишу.
10 дек 13, 10:27    [15269025]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
Glory
Member

Откуда:
Сообщений: 104760
declare @t TABLE (EmpID INT, Name nVARCHAR(50), Div  nVARCHAR(50))

insert @T values
	(1,N'Иванов',N'отдел')
	,(2,N'Петров',N'отдел')
	,(3,N'Сидоров',N'отделение')
	,(4,N'Егоров',N'отделение')
	,(5,N'Серегин',N'группа')
	,(6,N'Васькин',N'группа')
	
select name, div, max(empid)
 from @t group by div, name with rollup
 having grouping(div) = 0

Остальное "допилить" через case
10 дек 13, 10:45    [15269150]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
Virtuoz
Member

Откуда: Украина
Сообщений: 307
Или добавить

 order by 3 desc,1 
10 дек 13, 10:58    [15269274]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
Алексаша
Member

Откуда: Левый берег
Сообщений: 392
Glory,

Ваше решение понравилось :)

Ребята, все спасибо.
10 дек 13, 18:10    [15273265]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
kikki
Member

Откуда: киккятница
Сообщений: 20681
create TABLE #T (EmpID INT, Name VARCHAR(50), Div  VARCHAR(50))

insert #T values
	(1,'Иванов','отдел')
	,(2,'Петров','отдел')
	,(3,'Сидоров','отделение')
	,(4,'Егоров','отделение')
	,(5,'Серегин','группа')
	,(6,'Васькин','группа')
	
select
	tt.EmpID,
	tt.Name,
	case 
		when tt.Div = tt.Name then null
		else tt.Div
	end	
from
	(
		select 
			
			t2.EmpID,
			t2.Name,
			t2.Div

		from
			#T as t2	
			
		union all
		select 
			null,
			t1.Div,
			t1.Div
			
		from
			(select distinct Div from #T) as t1
		) as tt
order by
	tt.Div asc,
	case 
		when tt.Div = tt.Name then null
		else tt.Div
	end,
	tt.Name asc

drop table #T
10 дек 13, 19:44    [15273623]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
kikki
Member

Откуда: киккятница
Сообщений: 20681
Я опоздал, но может быть, кто-нибудь посмотрит моё решение ради эстетической цели?
10 дек 13, 20:19    [15273739]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
sdet
Member

Откуда:
Сообщений: 463
kikki
Я опоздал, но может быть, кто-нибудь посмотрит моё решение ради эстетической цели?

И в что в нем эстетического? Чем оно лучше других?
10 дек 13, 20:51    [15273847]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
kikki
Member

Откуда: киккятница
Сообщений: 20681
sdet,

не используется курсор, не используются методы, не входящие в стандартный SQL
потом - на мой взгляд - понятнее алгоритмически, естественнее, поэтому в тексте запроса разобраться легче

примерно так
10 дек 13, 20:53    [15273853]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
sdet
Member

Откуда:
Сообщений: 463
kikki
sdet,

не используется курсор, не используются методы, не входящие в стандартный SQL
потом - на мой взгляд - понятнее алгоритмически, естественнее, поэтому в тексте запроса разобраться легче

примерно так

А что в других решениях использовался курсор?
На мой взгляд текст запроса наоборот выглядит усложненным для такой задачи.
10 дек 13, 21:02    [15273892]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
kikki
Member

Откуда: киккятница
Сообщений: 20681
sdet,

нет. Там же каждая строчка по несколько символов всего. А сами переходы на другую строчку и отступы нужны для понимания. Новый уровень отступа - следующий подзапрос или выражение, находящееся внутри очередной секции (т.е. select, from, where, case и т.д.).
10 дек 13, 21:03    [15273906]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
Glory
Member

Откуда:
Сообщений: 104760
kikki
не используется курсор,

Т.е. вы сравнивали ваш вариант с курсором по производительности ?

kikki
не используются методы, не входящие в стандартный SQL

Вы про какой из стандартов конкретно говорите ?

kikki
А сами переходы на другую строчку и отступы нужны для понимания. Новый уровень отступа - следующий подзапрос или выражение, находящееся внутри очередной секции (т.е. select, from, where, case и т.д.).

Т.е. надо оценить то, как вы умеете форматировать тексты ?
11 дек 13, 10:32    [15275379]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
kikki
Member

Откуда: киккятница
Сообщений: 20681
Glory,

я ламер. Какой правильный ответ?

Пытался сделать упор на то, что мой запрос может быть понятен, если его текст увидит незнакомый человек.
11 дек 13, 10:55    [15275506]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
Glory
Member

Откуда:
Сообщений: 104760
kikki
что мой запрос может быть понятен, если его текст увидит незнакомый человек.

Т.е. вы хотите обсудить нотации именований и стандарты форматирования что ли ?
11 дек 13, 11:09    [15275580]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
kikki
Member

Откуда: киккятница
Сообщений: 20681
Glory,

нет, так нельзя сказать
11 дек 13, 11:27    [15275704]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
Алексаша
Member

Откуда: Левый берег
Сообщений: 392
sdet,

справедливости ради хочу и вам отдельное спасибо выразить. начал разбирать как работает пример предложенный Glory, т.к. привлек минимализмом чтоли ... в справке нашел о том что следует воздержаться от with rollup. в итоге пересмотрел Ваш пример и подумал как я сам до этого не допер, тем более у меня есть поле согласно которого я потом все и сортирую.

Еще раз всем спасибо.
11 дек 13, 13:54    [15276739]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для отчета  [new]
Glory
Member

Откуда:
Сообщений: 104760
Алексаша
в справке нашел о том что следует воздержаться от with rollup.

В медицинской или какой ?
11 дек 13, 13:57    [15276755]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить