powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Голову сломал! Помогите
16 сообщений из 16, страница 1 из 1
Голову сломал! Помогите
    #32054351
dao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть справочник в виде дерева
Код: plaintext
1.
2.
3.
4.
5.
idtype  name idparent
 1        type1   null
 2        type2     1 
 3        type3     2 
 4        type4     2 

и 2 таблица
Код: plaintext
1.
2.
3.
4.
5.
id idcomp idtype countp
 1     1          2         2 
 2     2          4         2 
 3     2          3         3 
 4     3          1         5 

надо вернуть вот такой результат
Код: plaintext
1.
2.
3.
4.
5.
idType sum(countp)
 1             12   
 2             7     
 3              2 
 4              2 

т.е. сумму из второй таблицы по полю countp по каждому узлу и по всем потомкам входящим в него
Подскажите какинть идеи...
...
Рейтинг: 0 / 0
Голову сломал! Помогите
    #32054366
fima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понял, поля "id" и "idcomp" нас не интересуют. Сначала Вам надо развернуть структуру дерева, т.е получить ид "листьев" и "веток"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
set @level =  1 
insert into #stack select @level, idtype
from Table
where Table.idtype = @Указанная ветка
while @Count_Item <>  0 
begin
	set @Level = @Level +  1 
	insert into #stack select idtype, @level
	from Table
	where Table.idparent in (select ID_ from #stack
		where [Level] = @Level -  1 )
	select @Count_Chapter = @@rowcount
	set @Last_ID = @@identity
end

А после этого
Код: plaintext
1.
2.
3.
4.
select idtype, sum(countp)
from Table2 inner join #stack on
Table2.idtype = #stack.idtype
group by Table2.idtype

Вот приблизительно так. В коде возможны синтаксические ошибки... Прошу прощения мало времени. Я пытался показать логику.
...
Рейтинг: 0 / 0
Голову сломал! Помогите
    #32054378
dao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как я понял в #stack лежат id типа и его уровень? А зачем нам это если ето дальше не используется . По второму запросу -получим только вхождения в данный тип а в родительские?
Если что не так понял -поправь
...
Рейтинг: 0 / 0
Голову сломал! Помогите
    #32054384
dao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да забыл - уровни есть - просто не всю таблицу привел.
На самом деле у неё вот такая структура
[scr]
id name tag
[/scr]
-где tag -путь к узлу - я его на промежуточном этапе привожу к тому виду для слияния с другим деревом
а уровень определяется по tag - там простая формула
...
Рейтинг: 0 / 0
Голову сломал! Помогите
    #32054399
fima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>По второму запросу -получим только вхождения в данный тип а в родительские?
Прошу прощения недопонял вопрос... Что то кроме курсора в голову ничего не приходит...
...
Рейтинг: 0 / 0
Голову сломал! Помогите
    #32054407
dao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да мне тож кроме глобального курсора по второй таблице в голову не приходит. Там еще несколько деревьев подвешиваются - выше приведённый вопрос это только кусок всей заморочки.
...
Рейтинг: 0 / 0
Голову сломал! Помогите
    #32054412
fima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Могу посоветовать только следующее: я в таких случаях иду к постановщикам задач и узнаю, можно ли как то изменить задачу.
...
Рейтинг: 0 / 0
Голову сломал! Помогите
    #32054443
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
приведи пример с данными....
...
Рейтинг: 0 / 0
Голову сломал! Помогите
    #32054474
dao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем итог таков - сделал доп таблицу3 - в которой idtype id типа и allChild - все потомки + сам узел (конечно решение не оптимальное ) по ней и стал работать -соответственно если есть id в потомках то и тягаю эту строку(idtype).
Вроде всё получилось. Типа
Код: plaintext
1.
2.
3.
select sum(countp),t3.idtype from t3,t2
where t3.allChild like t2.idtype
group by t3.idtype 

и потом уже цепляю к справочнику (t1)
А вообще через месяц 40% переделывать в плане стоит! (правда не из-за этого) я под это дело всю эту муру и переделаю в нормальный вид!

Правда осталась проблема с поддержанием доп таблицы(t3) в актуальном соотоянии
Кто что предложит ?
При каждом удалении/добавлении в дерево переделывать таблицу(t3)? Всё организованно на процедурах -select ; update ; delete
и обновлении t3 - на процедуре.
Или кто что другое предложит?
2 MiCe- про данные - немного утрированный но смотри первое сообшение
...
Рейтинг: 0 / 0
Голову сломал! Помогите
    #32054478
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересует поле tag....
...
Рейтинг: 0 / 0
Голову сломал! Помогите
    #32054486
dao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 MiCe
в tag лежат id родителей - для примера по t1
Код: plaintext
1.
2.
3.
4.
id  name  tag 
...
 3   type3  { 1 }{ 2 }
...


P.S. - мне на будущее принимаются идеи как это сделать нормально
Дано
таблицы:
компании
доступ
позиции компании
тип компании
пользователи
связи:
компания->тип компании
компания -> доступ <- пользователь
компания ->позиции компании

Компания может иметь несколько типов
Надо :Количество позиций по каждому типу + по всем потомкам входящим в этот узел
...
Рейтинг: 0 / 0
Голову сломал! Помогите
    #32054511
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
именно {...}?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
union all select  3 ,'type3', 2 ,'{1}{2}'
union all select  4 ,'type4', 2 ,'{1}{2}'

create table #t2(id int,idcomp int, idtype int, countp int)
insert into #t2 select  1 , 1 , 2 , 2 
union all select  2 , 2 , 4 , 2 
union all select  3 , 2 , 3 , 3 
union all select  4 , 3 , 1 , 5 

select *
from #t1,#t2
where #t2.idtype=#t1.idtype 
   or #t1.tag like '%{'+cast(#t2.idtype as varchar( 10 ))+'}%'
 -- вау.... то что нуно....
 
select #t2.idtype,sum(#t2.countp)
from #t1,#t2
where #t2.idtype=#t1.idtype 
   or #t1.tag like '%{'+cast(#t2.idtype as varchar( 10 ))+'}%'
group by #t2.idtype

drop table #t1
drop table #t2
...
Рейтинг: 0 / 0
Голову сломал! Помогите
    #32054518
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пырдонс....
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
create table #t1(idtype int,name varchar( 10 ),idparent int null,tag varchar( 200 ))
insert into #t1 select  1 ,'type1', null,''
union all select  2 ,'type2', 1 ,'{1}'
union all select  3 ,'type3', 2 ,'{1}{2}'
union all select  4 ,'type4', 2 ,'{1}{2}'

create table #t2(id int,idcomp int, idtype int, countp int)
insert into #t2 select  1 , 1 , 2 , 2 
union all select  2 , 2 , 4 , 2 
union all select  3 , 2 , 3 , 3 
union all select  4 , 3 , 1 , 5 

select *
from #t1,#t2
where #t2.idtype=#t1.idtype 
   or #t1.tag like '%{'+cast(#t2.idtype as varchar( 10 ))+'}%'
 -- вау.... то что нуно....
 
select #t2.idtype,sum(#t2.countp)
from #t1,#t2
where #t2.idtype=#t1.idtype 
   or #t1.tag like '%{'+cast(#t2.idtype as varchar( 10 ))+'}%'
group by #t2.idtype

drop table #t1
drop table #t2
...
Рейтинг: 0 / 0
Голову сломал! Помогите
    #32054530
dao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 MiCe вообщем таже идея - только в tag лежат родители
а для меня ет не подходит - уже прошел эт вариант :))- надо делать не по родителям а по потомкам
...
Рейтинг: 0 / 0
Голову сломал! Помогите
    #32054537
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не совсем понял.....
как я понял нужно было от узла до всех потомков ....
а доперло......
каюсь....
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
create table #t1(idtype int,name varchar( 10 ),idparent int null,tag varchar( 200 ))
insert into #t1 select  1 ,'type1', null,''
union all select  2 ,'type2', 1 ,'{1}'
union all select  3 ,'type3', 2 ,'{1}{2}'
union all select  4 ,'type4', 2 ,'{1}{2}'

create table #t2(id int,idcomp int, idtype int, countp int)
insert into #t2 select  1 , 1 , 2 , 2 
union all select  2 , 2 , 4 , 2 
union all select  3 , 2 , 3 , 3 
union all select  4 , 3 , 1 , 5 

select t.id,sum(#t2.countp)
from (select #t2.idtype as id,#t1.idtype 
      from #t1,#t2
      where #t2.idtype=#t1.idtype 
            or #t1.tag like '%{'+cast(#t2.idtype as varchar( 10 ))+'}%')t
      join #t2 on t.idtype=#t2.idtype
group by t.id


drop table #t1
drop table #t2
...
Рейтинг: 0 / 0
Голову сломал! Помогите
    #32054589
dao
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вобщем по данной реализации тема закрыта -уже всё сделал :)) -всем спасибо - но идеи по реализации принимаются
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Голову сломал! Помогите
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]