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

Откуда:
Сообщений: 3
Всем привет, ситуация такая, нужно сделать пустую строку, есть примерно такая ситуация

group id id
1 1
1 2
1 3
1 4
2 5
2 6
3 7
3 7

хочется после каждой группы делать пустую строку

group id id
1 1
1 2
1 3
1 4

2 5
2 6

3 7
3 7

как это реализовать? Спасибо.
8 апр 19, 20:06    [21856450]     Ответить | Цитировать Сообщить модератору
 Re: Пустая строка между группой результатов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36269
В MSSQL нет понятия "пустая строка".
8 апр 19, 20:12    [21856455]     Ответить | Цитировать Сообщить модератору
 Re: Пустая строка между группой результатов  [new]
kkaft
Member

Откуда:
Сообщений: 3
Гавриленко Сергей Алексеевич, да, не совсем корректно выразился, но мне как-то нужно сделать такой отступ после каждой группы запросов
8 апр 19, 20:20    [21856463]     Ответить | Цитировать Сообщить модератору
 Re: Пустая строка между группой результатов  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 3926
kkaft,

Выдайте сюда код, которым вы группируете. Тогда что-то можно сделать.

GROUP BY GROUPING SETS может решить вашу задачу, но надо сначала понять, что вы группируете. group id id это невалидный синтаксис
8 апр 19, 20:27    [21856466]     Ответить | Цитировать Сообщить модератору
 Re: Пустая строка между группой результатов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36269
kkaft
Гавриленко Сергей Алексеевич, да, не совсем корректно выразился, но мне как-то нужно сделать такой отступ после каждой группы запросов
Нарисуйте ваше клиентское приложени и там отображайте как хотите. При чем тут сервер-то?
8 апр 19, 20:39    [21856471]     Ответить | Цитировать Сообщить модератору
 Re: Пустая строка между группой результатов  [new]
Valera Kochemasov
Member

Откуда: Moscow
Сообщений: 19
kkaft,
declare @tempo table (SmMon money, Grp int)
insert @tempo
select 111, 0
union all select 222, 0
union all select 333, 0
union all select 444, 1
union all select 555, 1
union all select 666, 2
union all select 776, 2

declare @space table (SmMon sql_variant)

declare @int int select @int=min(Grp) from @tempo
declare @max int select @max=max(Grp) from @tempo
while @int<=@max
begin
insert @space select SmMon from @tempo where Grp=@int
insert @space select 0
set @int=@int+1
end

select case when SmMon=0 then ' ' else SmMon end from @space
go
8 апр 19, 22:29    [21856541]     Ответить | Цитировать Сообщить модератору
 Re: Пустая строка между группой результатов  [new]
kkaft
Member

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

Запрос примитивный:

SELECT group_id, id
FROM idtable
GROUP BY group_id, id
ORDER BY group_id ASC
8 апр 19, 22:42    [21856549]     Ответить | Цитировать Сообщить модератору
 Re: Пустая строка между группой результатов  [new]
Valera Kochemasov
Member

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

малёк поточнее
declare @tempo table (SmMon money, Grp int)
insert  @tempo
          select 111, 0
union all select 222, 0
union all select 333, 0
union all select 444, 1
union all select 555, 1
union all select 666, 2
union all select 776, 2

declare @space table (SmMon sql_variant)

declare @int int select @int=min(Grp) from @tempo
declare @max int select @max=max(Grp) from @tempo
while @int<=@max
 begin
  insert @space select SmMon from @tempo where Grp=@int
  if @int<@max insert @space select 0
  set @int=@int+1
 end

select case when SmMon=0 then ' ' else SmMon end from @space
go
8 апр 19, 22:59    [21856554]     Ответить | Цитировать Сообщить модератору
 Re: Пустая строка между группой результатов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36269
Valera Kochemasov,

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

UPD

Хотя бы так:

declare @tempo table (SmMon money, Grp int)
insert  @tempo
          select 111, 0
union all select 222, 0
union all select 333, 0
union all select 444, 1
union all select 555, 1
union all select 666, 2
union all select 776, 2

select
    a.SmMon
    , Grp = iif ( tag = 0, a.Grp, null )
from (
    select 
        *
        , tag = 0 
    from @tempo a
    union all 
    select distinct
        null
        , b.grp
        , tag = 1
    from @tempo b
    where
        b.grp < ( select max(x.grp) from @tempo x )
) a
order by
    a.Grp
    , a.tag
    , a.SmMon


Но, в целом, задача очень странная и имеет отношение к отображению, а не к выборке данных.
9 апр 19, 00:17    [21856571]     Ответить | Цитировать Сообщить модератору
 Re: Пустая строка между группой результатов  [new]
Valera Kochemasov
Member

Откуда: Moscow
Сообщений: 19
Гавриленко Сергей Алексеевич
Valera Kochemasov,

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

UPD

Хотя бы так:

declare @tempo table (SmMon money, Grp int)
insert  @tempo
          select 111, 0
union all select 222, 0
union all select 333, 0
union all select 444, 1
union all select 555, 1
union all select 666, 2
union all select 776, 2

select
    a.SmMon
    , Grp = iif ( tag = 0, a.Grp, null )
from (
    select 
        *
        , tag = 0 
    from @tempo a
    union all 
    select distinct
        null
        , b.grp
        , tag = 1
    from @tempo b
    where
        b.grp < ( select max(x.grp) from @tempo x )
) a
order by
    a.Grp
    , a.tag
    , a.SmMon


Но, в целом, задача очень странная и имеет отношение к отображению, а не к выборке данных.


Уважаемый Академик! Я, как жалкий НЕУЧ, сообщаю Вам, что ваш код НЕ РАБОТАЕТ в SQL Server 2005. Настоятельно рекомендую Вам не морочить голову начинающим.
9 апр 19, 00:37    [21856581]     Ответить | Цитировать Сообщить модератору
 Re: Пустая строка между группой результатов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36269
Модератор: Valera Kochemasov,

Я вам выдал недельный бан, чтобы вы подумали над двумя вопросами:

1. Этот код не работает практически нигде -- ни на MSSQL 2005, ни на SQL 4.2, ни в оракле или кассандре. Однако, если автором топика версия сервера не озвучена, то большинство как правило не предполагает, что вопрос про раритет или это оффтопик. Тот факт, что вы используете устаревшую и не поддерживаемую версию, говорит лишь в пользу того, что вы ССЗБ.

2. Как будет выглядеть ваш код для следующих начальных данных:

declare @tempo table (SmMon money, Grp float)
insert  @tempo
          select 111, 0 + 1. / 99999
union all select 222, 0 + 1. / 99999
union all select 333, 0 + 1. / 99999
union all select 444, 1 + 1. / 66666
union all select 555, 1 + 1. / 66666
union all select 666, 2 + 1. / 33333
union all select 776, 2 + 1. / 33333

9 апр 19, 00:45    [21856583]     Ответить | Цитировать Сообщить модератору
 Re: Пустая строка между группой результатов  [new]
aleks222
Member

Откуда:
Сообщений: 693
Нормальный код - это когда просто и правильно
Учись, студент

declare @idtable table (id int, group_id int)
insert  @idtable
          select 111, 0
union all select 222, 0
union all select 333, 0
union all select 444, 1
union all select 555, 1
union all select 666, 2
union all select 776, 2
;

SELECT group_id, id
FROM @idtable
GROUP BY group_id, id
ORDER BY group_id ASC ;

with query as (SELECT Ord = 0, group_id, id FROM @idtable GROUP BY group_id, id )
   , emptyStr as ( SELECT Ord = 1, group_id, id = null FROM @idtable GROUP BY group_id )
   , queryWithEmptyStr as ( select * from query union all select * from emptystr )
 select group_id = case when id is not null then group_id end, id from queryWithEmptyStr as t order by t.group_id ASC, t.Ord asc
9 апр 19, 05:50    [21856626]     Ответить | Цитировать Сообщить модератору
 Re: Пустая строка между группой результатов  [new]
invm
Member

Откуда: Москва
Сообщений: 8661
SemiGen
У Валеры универсальнее, можно в разделительные строки вставлять дополнительную информацию - промежуточные Суммы, Количество Строк, Заголовки с Названием Групп и т. д.
Для реализации перечисленной фигни циклы не нужны. Так что у Валеры типичный говнокод.

Ну и можно не читать исходную таблицу несколько раз
with s as
(
 select
  id, group_id,
  max(id) over (partition by group_id) as max_of_id,
  1 as row_order
 from
  @idtable
)
select
 a.group_id, a.id
from
 s cross apply
 (select s.id, s.group_id, s.row_order union all select null, null, 2 where s.id = s.max_of_id) a
order by
 s.group_id, s.id, a.row_order;
9 апр 19, 10:24    [21856796]     Ответить | Цитировать Сообщить модератору
 Re: Пустая строка между группой результатов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36269
Модератор: Клона Валеры, который восхищался Валерой, я забанил. Валере -- еще одна такая выходка, и бан будет перманентный.
9 апр 19, 11:21    [21856881]     Ответить | Цитировать Сообщить модератору
 Re: Пустая строка между группой результатов  [new]
Владислав Колосов
Member

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

Ваше желание хорошее, но форматирование текста надо делать на стороне клиентского приложения.
9 апр 19, 11:52    [21856918]     Ответить | Цитировать Сообщить модератору
 Re: Пустая строка между группой результатов  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 3926
kkaft,

declare @tempo table (ID INT IDENTITY (1,1), SmMon money, Grp int)
insert  @tempo
          select 111, 0
union all select 222, 0
union all select 333, 0
union all select 444, 1
union all select 555, 1
union all select 666, 2
union all select 776, 2


SELECT SmMon, Grp, COUNT(ID)
FROM @tempo
GROUP BY GROUPING SETS ((SmMon, Grp), (Grp))
ORDER BY Grp, GROUPING(SmMon), SmMon
9 апр 19, 12:54    [21857009]     Ответить | Цитировать Сообщить модератору
 Re: Пустая строка между группой результатов  [new]
Oleg_SQL
Member

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

Конкретно, под Ваши данные. Под свежую версию.

DECLARE @T TABLE (GroupId INT, Id INT)
INSERT @T VALUES (1, 1),(1, 2),(1, 3),(1, 4),(2, 5),(2, 6),(3, 7),(3, 7)

; WITH CTE AS 
(
SELECT GroupId, Id 
  FROM @T
  UNION ALL 
  SELECT  GroupId, NULL
  FROM @T
  GROUP BY GroupId
) 
SELECT 
       IIF(Id IS NULL, NULL, GroupId) AS GroupId, 
       Id
  FROM CTE
 ORDER BY ROW_NUMBER() OVER(ORDER BY GroupId, ISNULL(Id, CHECKSUM(0*NULL))) 
9 апр 19, 17:49    [21857556]     Ответить | Цитировать Сообщить модератору
 Re: Пустая строка между группой результатов  [new]
Valera Kochemasov
Member

Откуда: Moscow
Сообщений: 19
Ой, напугал! Да бань сколько хочешь. Всё равно польза твоя никакая - оскорбляешь, посылаешь в хелп.
Есть другие форумы, весьма достойные. Народ там доброжелательный, а модераторы не хамят новичкам.
16 апр 19, 03:11    [21863145]     Ответить | Цитировать Сообщить модератору
 Re: Пустая строка между группой результатов  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6532
Valera Kochemasov,

Вы считаете читать справку ниже своего достоинства, что ли? Недостойно задавать вопросы, не прочитав справку.
16 апр 19, 11:22    [21863436]     Ответить | Цитировать Сообщить модератору
 Re: Пустая строка между группой результатов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6376
Valera Kochemasov
Ой, напугал! Да бань сколько хочешь. Всё равно польза твоя никакая - оскорбляешь, посылаешь в хелп.
Есть другие форумы, весьма достойные. Народ там доброжелательный, а модераторы не хамят новичкам.

Валера - хороший!
16 апр 19, 11:27    [21863440]     Ответить | Цитировать Сообщить модератору
 Re: Пустая строка между группой результатов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36269
Valera Kochemasov,

Ага, и конкурсы там интересные. Удачи на просторах интернетов.
16 апр 19, 12:41    [21863541]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить