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

Откуда: Россия
Сообщений: 112
Народ, может кто знает как в 2к скуле решить задачку?

SELECT
kontragent,
dogovor,
curency,
sum(amount)
FROM table
GROUP BY kontragent, dogovor, curency WITH CUBE

идя такая, должно выводить и на каждом уровне еще группировка по curency
kontragent1
dogovor1
dogovor2
kontragent2
....

Запрос свое выполняет, но сортировка в корне убивает. Идет от большего тоесть самых заполненных, а точнее сначала группировка с заполненными всеми группировками, а потом уж более укрупненные.
Если просто ORDER BY делать, то внизу нужные итоговые по всему улетают вверх и это тоже не вариант тем более что и сортировка группировок обратная становится.
Есть идеи как это решить?
22 июн 15, 10:51    [17801046]     Ответить | Цитировать Сообщить модератору
 Re: WITH CUBE  [new]
pavlo1c
Member

Откуда: Россия
Сообщений: 112
SELECT 
    kontragent,
    dogovor,
    curency,
    sum(amount)
FROM table
GROUP BY kontragent, dogovor, curency WITH CUBE
22 июн 15, 10:53    [17801052]     Ответить | Цитировать Сообщить модератору
 Re: WITH CUBE  [new]
Wlr-l
Member

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

Использовать для сортировки функции, показывающие по каким столбцам произошло агрегирование.
22 июн 15, 12:27    [17801542]     Ответить | Цитировать Сообщить модератору
 Re: WITH CUBE  [new]
pavlo1c
Member

Откуда: Россия
Сообщений: 112
ага, спс
22 июн 15, 13:33    [17801847]     Ответить | Цитировать Сообщить модератору
 Re: WITH CUBE  [new]
pavlo1c
Member

Откуда: Россия
Сообщений: 112
А как то можно получить номера уровней группировок? с поправкой на версию скуля
22 июн 15, 13:58    [17801975]     Ответить | Цитировать Сообщить модератору
 Re: WITH CUBE  [new]
o-o
Guest
в 2000-ом работает GROUPING(),
только куда еще-то порядок править,
как раз без ORDER BY правильно показывает,
но если не нравится, сделайте в ORDER BY CASE с этими GROUPING()
declare @t table (kontragent int, dogovor int, curency int, amount int);
insert into @t 
select 1, 1, 1, 10 union all
select 2, 1, 1, 20 union all
select null, 3, 1, 30 union all
select 1, 1, 4, 40 

SELECT ISNULL(cast(kontragent as varchar(10)), CASE WHEN GROUPING(kontragent) = 0 THEN 'UNKNOWN' ELSE 'ALL' END) AS kontragent,
       ISNULL(cast(dogovor as varchar(10)), CASE WHEN GROUPING(dogovor) = 0 THEN 'UNKNOWN' ELSE 'ALL' END) AS dogovor,
       ISNULL(cast(curency as varchar(10)), CASE WHEN GROUPING(curency) = 0 THEN 'UNKNOWN' ELSE 'ALL' END) AS curency,    
       sum(amount)
FROM @t
GROUP BY kontragent, dogovor, curency WITH CUBE


К сообщению приложен файл. Размер - 56Kb
22 июн 15, 17:51    [17803043]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить