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

Откуда:
Сообщений: 2644
Скажите пожалуйста, как сгруппировать так, чтобы все данные подтянулись вверх без null?

То есть чтобы в все null оказались внизу, а все данные вверху?

Заранее благодарен.

К сообщению приложен файл. Размер - 70Kb
24 янв 18, 09:25    [21132826]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без null  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20185
Точно нужна группировка, а не сортировка?
24 янв 18, 09:43    [21132893]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без null  [new]
vah
Member

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

можно и сортировка, но как?
24 янв 18, 09:50    [21132933]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без null  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30747
vah
Akina,

можно и сортировка, но как?
Сортировку делают написанием ORDER BY в конце запроса.
Можно отсортировать по выражению:
case when [111] is null then 1 else 0 end
24 янв 18, 09:55    [21132967]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без null  [new]
vah
Member

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

вроде тоже самое получится...
24 янв 18, 10:00    [21133007]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без null  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
vah,

а без вроде?
хоть так
ORDER BY case when [111] is null then 1 else 0 end

хоть
ORDER BY ISNULL(111,'zzz')
24 янв 18, 10:04    [21133032]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без null  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30747
vah
alexeyvg,

вроде тоже самое получится...
Нет.
Репро приведите, или хоть код покажите, что вы там написали.
24 янв 18, 10:06    [21133043]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без null  [new]
vah
Member

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

	declare @sql nvarchar(max)=''

	set @sql = @sql + 'SELECT '+@var+' FROM (' + char(10) 
	set @sql = @sql + 'select distinct a.id,b.id idm,b.parentId,b.name from '  + char(10)  
	set @sql = @sql + '#tmp_struct a inner join #tmp_struct b on a.id=b.parentId' + char(10)  
	set @sql = @sql + 'where a.lvl=1' + char(10)  
	set @sql = @sql + ') AS pr ' + char(10) 
	set @sql = @sql + 'PIVOT (max(name) FOR [id] in ('+ @var+')) AS pvt'

	exec (@sql)
24 янв 18, 10:12    [21133067]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без null  [new]
Добрый Э - Эх
Guest
vah
alexeyvg,

	declare @sql nvarchar(max)=''

	set @sql = @sql + 'SELECT '+@var+' FROM (' + char(10) 
	set @sql = @sql + 'select distinct a.id,b.id idm,b.parentId,b.name from '  + char(10)  
	set @sql = @sql + '#tmp_struct a inner join #tmp_struct b on a.id=b.parentId' + char(10)  
	set @sql = @sql + 'where a.lvl=1' + char(10)  
	set @sql = @sql + ') AS pr ' + char(10) 
	set @sql = @sql + 'PIVOT (max(name) FOR [id] in ('+ @var+')) AS pvt'

	exec (@sql)
не увидел группировки или сортировки. от слова - совсем...
24 янв 18, 10:16    [21133080]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без null  [new]
aleksrov
Member

Откуда:
Сообщений: 948
Мне кажется мы его не так поняли, видимо он хочет чтобы было типа:
PR, СЛАБ, ?, ПКФ, Советник, это одна строка, и далее в том же духе.
24 янв 18, 10:28    [21133148]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без null  [new]
vah
Member

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

вот именно, сложно объяснить
24 янв 18, 10:30    [21133164]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без null  [new]
Добрый Э - Эх
Guest
vah,

что ли, просто в каждом столбце сдвинуть все данные вверх?

тогда тебе нужно разложить выборку на таблицы-столбцы. сделать столько таблиц, сколько столбцов желаешь видеть в итоговой выборке. каждую получившуюся таблицу-столбец перенумеровать при помощи row_number. далее фулл джойном соединить все эти поля-таблицы в один итоговый набор данных....
24 янв 18, 10:34    [21133204]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без null  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
vah
aleksrov,
вот именно, сложно объяснить

Сложно объяснить на пальцах? - давай данные и рисуй вывод, который из этих данных должен получиться.
24 янв 18, 10:35    [21133220]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без null  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Добрый Э - Эх,

согласен :)

DECLARE @a TABLE 
(
	[111] VARCHAR(5),
	[222] VARCHAR(5),
	[333] VARCHAR(5)
)

INSERT INTO @a VALUES
(NULL,NULL,'LLL'),
('AAAA',NULL,NULL),
(NULL,'BBB','CCC'),
('XXXX',NULL,'NNN'),
('DDDD',NULL,NULL),
(NULL,NULL,'III')


;WITH a as 
(
	SELECT 
		[r] = ROW_NUMBER() OVER (ORDER BY 1/0),
		[a] = [111] 
	FROM @a
	WHERE [111] IS NOT NULL
), b as 
(
	SELECT 
			[r] = ROW_NUMBER() OVER (ORDER BY 1/0),
			[a] = [222] 
	FROM @a
	WHERE [222] IS NOT NULL
), c as
(
	SELECT 
		[r] = ROW_NUMBER() OVER (ORDER BY 1/0),
		[a] = [333] 
	FROM @a
	WHERE [333] IS NOT NULL
)
SELECT 
	a.a,
	b.a,
	c.a
FROM a
FULL JOIN b
ON
	a.r = b.r
FULL JOIN c
ON
	c.r = a.r
24 янв 18, 10:42    [21133287]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без null  [new]
vah
Member

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

Спасибо!
24 янв 18, 11:02    [21133415]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без null  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Мой вариант "с сохранением структуры":
DECLARE @a TABLE 
(
	[111] VARCHAR(5),
	[222] VARCHAR(5),
	[333] VARCHAR(5)
)

INSERT INTO @a VALUES
('AAAA',NULL,NULL),
(NULL,NULL,'FFF'),
(NULL,'EEE',NULL),
(NULL,'BBB',NULL),
(NULL,NULL,'CCC'),
(NULL,NULL,'LLL'),
('XXXX',NULL,NULL),
('ZZZZ',NULL,NULL),
(NULL,NULL,'NNN'),
('DDDD',NULL,NULL),
(NULL,NULL,'III');



with 
A as 
(Select *,row_number() over (Order by (select 1)) as rn From @a ),
B as
(Select *,count([111]) over (Order by rn) as ID_111 From A),
C as
(Select *,
        count([222]) over (partition by ID_111 Order by rn) as ID_222,
	max([111]) over (partition by ID_111)  as [_111]
	From B),
D as
(Select *,
        count([333]) over (partition by ID_111,ID_222 Order by rn) as ID_333,
	max([222]) over (partition by ID_111,ID_222)  as [_222]
	From C),
E as
(Select *,
        max([333]) over (partition by ID_111,ID_222,ID_333)  as [_333],
	max(ID_222) over (partition by ID_111) as Count_222,
	max(ID_333) over (partition by ID_111,ID_222) as Count_333
	From D)
Select [_111],[_222],[_333] From E
Where not(Count_222>0 and ID_222 = 0) 
   and not(Count_333>0 and ID_333 = 0) 

Результат:
_111_222_333
AAAAEEE<NULL>
AAAABBBCCC
AAAABBBLLL
XXXX<NULL><NULL>
ZZZZ<NULL>NNN
DDDD<NULL>III
24 янв 18, 11:47    [21133660]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без null  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
TaPaK,
Если значений в столбце "B" больше, чем в "A", то результат будет некорректный. Правильнее:

SELECT 
	a.a,
	b.a,
	c.a
FROM a
FULL JOIN b
ON
	a.r = b.r
FULL JOIN c
ON
-----Исправление:
	c.r = isnull(a.r,b.r)
24 янв 18, 11:55    [21133719]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без null  [new]
aleksrov
Member

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

И что же неправильного, у нас Full Join, а значит будет в A будет Null, а в B знач.
А ваш запрос из разряда как простые вещи сделать сложными :)
24 янв 18, 12:09    [21133785]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без null  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
В моем варианте неправильное условие. правильнее так:
From E
Where not(Count_222>0 and ID_222 = 0 and Count_333=0) 
   and not(Count_333>0 and ID_333 = 0)
24 янв 18, 12:13    [21133811]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без null  [new]
Добрый Э - Эх
Guest
aleksrov,

да погодь ты критиковать....
человек второй день на форуме. ;)
пусть пишет любые решения. у него интересный ракурс в подходе к решению избитых задач форума.
нужно же оценить высоту полета его мысли.
свежая кровь оно всегда хорошо, может чего и для себя приглядим :)

З.Ы.
я на полном серьезе, без сарказма...
24 янв 18, 12:14    [21133818]     Ответить | Цитировать Сообщить модератору
 Re: Группировка без null  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
aleksrov,
При
INSERT INTO @a VALUES
(NULL,NULL,'LLL'),
('AAAA',NULL,NULL),
(NULL,'BBB','CCC'),
('XXXX',NULL,'NNN'),
('DDDD',NULL,NULL),
(NULL,NULL,'III'),
(NULL,'QQQ',NULL),
(NULL,'WWW',NULL),
(NULL,'EEE',NULL),
(NULL,'RRR',NULL)

получаем:
aaa
AAAABBBLLL
XXXXQQQCCC
DDDDWWWNNN
<NULL>EEE<NULL>
<NULL>RRR<NULL>
<NULL><NULL>III


А не:
aaa
AAAABBBLLL
XXXXQQQCCC
DDDDWWWNNN
<NULL>EEEIII
<NULL>RRR<NULL>
24 янв 18, 12:16    [21133838]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить