Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Группировка по группам верхнего уровня (число прочтений - 2125 )
Scorp_Progr
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 2
Зарегистрирован: 18. Июля 2008
Группировка по группам верхнего уровня
21. Июля 2008 :: 05:54
Печать  
ЕСть справочник Товары иерархический, структура справочника следующая, группы самомго верхнего уровня - производители, групы следующих уровней - группы товаров, сам элемент - товар.
Задача следующая нужно сгруппировать продажи по производителям, запрос построил следующий:

SELECT
Выборка.Производитель as [Товар $Справочник.Товары],
Выборка.Клиент as [Клиент $Справочник.Клиенты],
Выборка.Период as Период,
Выборка.ИтогОбщий as ИтогОбщий,
Выборка.ИтогПроизводитель as ИтогПроизводитель,
Выборка.Сумма as Сумма
FROM
(
Select
Выборка1.Производитель as Производитель,
Выборка1.Клиент as Клиент,
Выборка1.Период as Период,      
GROUPING(Выборка1.Производитель) as ИтогОбщий,
GROUPING(Выборка1.Клиент) as ИтогПроизводитель,
SUM(Выборка1.Сумма) as Сумма
FROM
(
Select                                      
CASE
WHEN СпрРРРРР.ID = $ПустойИД
THEN
CASE
WHEN СпрРРРР.ID = $ПустойИД
THEN
CASE
WHEN СпрРРР.ID = $ПустойИД
THEN
CASE
WHEN СпрРР.ID = $ПустойИД
THEN
СпрР.ID
ELSE
СпрРР.ID
END
ELSE
СпрРРР.ID
END
ELSE
СпрРРРР.ID
END
ELSE
СпрРРРРР.ID
END as Производитель,

Рег.Клиент as Клиент,      
Рег.Период,      
Рег.ОборотОборот as Сумма
FROM
$РегистрОбороты.Продажи(:Дата1,:Дата2~,День,,"+усл+",(Товар,Клиент),(Оборот)) as Рег
LEFT JOIN
$Справочник.Товары as СпрР ON СпрР.ID = Рег.Товар
LEFT JOIN
$Справочник.Товары as СпрРР ON СпрРР.ID = СпрР.ParentID
LEFT JOIN
$Справочник.Товары as СпрРРР ON СпрРРР.ID = СпрРР.ParentID
LEFT JOIN
$Справочник.Товары as СпрРРРР ON СпрРРРР.ID = СпрРРР.ParentID
LEFT JOIN
$Справочник.Товары as СпрРРРРР ON СпрРРРРР.ID = СпрРРРР.ParentID      
) as Выборка1  
GROUP BY
Выборка1.Производитель , Выборка1.Клиент, Выборка1.период  WITH ROLLUP
) as Выборка  
LEFT JOIN
$Справочник.Товары as СпрПроизв ON СпрПроизв.ID = Выборка.Производитель
ORDER BY
СпрПроизв.Descr, Выборка.Клиент, Выборка.Период, Выборка.ИтогОбщий DESC, Выборка.ИтогПроизводитель DESC

Проблема следующая, когда иерархия групп сдержит 4 уровня групп, то все нормально, если меньше, то вместо производителя возвращяется пустая строка, хотя в операторе Case (выделенном жирным цветом) все это предусматривается, что я неправильно написал в выделенном жирным цветом блоке? Как оперделить в кейсе пустой ли родитель или нет ?
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Группировка по группам верхнего уровня
Ответ #1 - 21. Июля 2008 :: 06:16
Печать  
Правильнее так:
Код
Выбрать все
CASE
    WHEN СпрР.PARENTEXT = $ПустойИД
    THEN  СпрР.ID
    ELSE  СпрРР.ID
END 


Или так:
Код
Выбрать все
CASE
    WHEN СпрРР.ID Is Null
    THEN  СпрР.ID
    ELSE  СпрРР.ID
END 


А ещё есть функции Coalesce() и IsNull().
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Scorp_Progr
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 2
Зарегистрирован: 18. Июля 2008
Re: Группировка по группам верхнего уровня
Ответ #2 - 21. Июля 2008 :: 06:26
Печать  
Или так:
Код
Выбрать все
CASE  
    WHEN СпрРР.ID Is Null
    THEN  СпрР.ID  
    ELSE  СпрРР.ID  
END 




Большое спасибо, такой вариант сработал Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать