Форум Краматорська
Краматорськ та світ навколо нас => Компьютеры, мобилки, софт, Интернет, провайдеры => Тема розпочата: Enakievo від 09 Жовтня 2015, 16:36:52
-
Есть задачка, нужна помощь
-
Давай!
-
Пости сюда
-
Есть.
Ответ на вопрос топикстартера дан, тему можно закрывать :D
Так где задачка-то?
-
Помогите правильно написать запрос
select
COUNT(*),namedse,headtyp,label
from sostav_tp
group by label,namedse,headtyp
Группирующий по некоему общему признаку label
Результат этого запроса:
namedse headtyp label
3 Корневая сборка Изделие - головная сборка NULL
1 Вторая деталь корневой сборки Деталь 4422
5 Деталь корневой сборки Деталь 4422
1 Деталь подсборки 1 Деталь 4423
1 Подсборка 1 уровня Сборочная единица 4423
2 Деталь подсборки второго уровня Деталь 4431
1 Подсборка 2-го уровня Сборочная единица 4431
1 Вторая подсборка 1-го уровня Сборочная единица 4474
1 Деталь второй подсборки 1-го уровня Деталь 4474
1 Деталь подсборки третьего уровня Деталь 4481
1 Подсборка третьего уровня Сборочная единица 4481
Как сделать, чтобы в своей группировке каждая подсборка была над своими деталями в результате запроса?
P.S. Возможно, решение где-то на поверхности. И может через self-join. Но пока не выходит :)
-
Это был вопрос, или ответ? Или вопрос с ответом? :) потому что resultset вроде похож на правду, а вот
Группирующий по некоему общему признаку label
у тебя-то подсчитывает количество по уникальным комбинациям label,namedse,headtyp, а не
Группирующий по некоему общему признаку label
p.s. По-хорошему, вопрос нужно оформлять с исходными данными, и что должно быть на выходе (resultset). А так ощущение, что дал неправильный запрос, и его нужно пофиксить. Если так - то ощущение, что там нужно делать декартово произведение по label (full join). Но лучше напиши контрольный пример - так будет быстрее, т.к. телепаты в отпуске
p.p.s. У тебя в таблице - древовидная структура "сборка-деталь"? Каким образом описаны в таблице эти связи (корневая понятно - null в label, а дальше как идет ветвление, и какой признак сборки/детали?) Ты, небось, не все поля нам показал
-
В общем, нужно знать, как строится дерево по таблице sostav_tp - сейчас недостаточно данных чтобы определить, какая деталь принадлежит какой подсборке
-
Какая-то хрень у тебя с исходными данными: 3 одинаковые корневые сборки (корневой элемент он всегда один, по определению - на то он и корневой, уровни иерархии - только корневые сборки - подсборки на одном уровне, непонятно как сопоставляемые с корневой сборкой, детали подсборки на одном уровне. При чем тут "Подсборка первого уровня", "Подсборка второго уровня". Короче, хрен поймешь модель твоих данных.
Это сейчас такие задачи профессура дает студентам? Или студенты так хорошо делают дизайн объектов в базе данных? Явно не хватает некого ParentID, в простейшем виде, или отдельной таблички, чтобы не нарушить целостность данных, с полями ParentID - ChildID, тогда можно было бы написать красивый запрос
-
Явно не хватает некого ParentID, в простейшем виде, или отдельной таблички, чтобы не нарушить целостность данных, с полями ParentID - ChildID, тогда можно было бы написать красивый запрос
+1
В данном виде ничего не получится.
-
Вот напиши, как у тебя разворачивается иерархия. Потому что иерархия сборка - деталь вроде этот ужас уже понятен, а вот как сборка привинчена к корневой записи - у корневой-то label is null
-
Вот напиши, как у тебя разворачивается иерархия. Потому что иерархия сборка - деталь вроде этот ужас уже понятен, а вот как сборка привинчена к корневой записи - у корневой-то label is null
да, пожалуй я сам намутил и в этом же запутался.
label можно вообще забыть. вот вся таблица
select headid,iddse,obozndse,namedse,oper from sostav_tp
1 4422 000_СБ Корневая сборка Горизонтально-фрезерная ТЕСТОВАЯ
1 4422 000_СБ Корневая сборка Сборка
1 4422 000_СБ Корневая сборка Сборка и монтаж ИЭТ распайка в "тару-спутник"
4431 4432 000.001.001.000 Деталь подсборки второго уровня Глянцовочная
4431 4432 000.001.001.000 Деталь подсборки второго уровня Контроль количества штук
4423 4431 000.001.001СБ Подсборка 2-го уровня Монтаж
4422 4423 000.001СБ Подсборка 1 уровня Развальцовка
4423 4425 000.001.001 Деталь подсборки 1 Контактная сварка рельефная
4422 4424 000.000.001 Деталь корневой сборки Расточная
4422 4424 000.000.001 Деталь корневой сборки Нагревание
4422 4424 000.000.001 Деталь корневой сборки Фрезерно-отрезная
4422 4424 000.000.001 Деталь корневой сборки Грунтование наливом, обливом
4422 4424 000.000.001 Деталь корневой сборки Упаковывание
4422 4474 000.002СБ Вторая подсборка 1-го уровня Холодная сварка
4474 4475 000.002.001 Деталь второй подсборки 1-го уровня Ковка
4431 4481 000.002.002 СБ Подсборка третьего уровня Приклеивание
4481 4482 000.002-001 Деталь подсборки третьего уровня Эматалирование
4422 4487 000.000.002 Вторая деталь корневой сборки Старение
порядок в колонке oper произвольный
-
вот вся таблица
Всю таблицу вообще-то можно увидеть через select * from sostav_tp
Посмотри внимательно на свои данные - 3 корневые сущности, абсолютно одинаковые. Сущность "Подсборка 1 уровня Развальцовка" с какой именно сопоставляется, а?
Исходя из того, что у тебя не база данных, а свалка данных - делай хранимку, в ней перебирай курсором (создаешь временную таблицу @sostav_tp, с такой же структурой, курсором разворачиваешь иерархию вниз, как тебе нужно, вставляешь записи во временную таблицу, в оконцовке делаешь select * from @sostav_tp и будет тебе счастье)
p.s. Есть 2 типа T-SQL разработчиков: те, которые используют суррогатные ключи, и те, которые уже используют суррогатные ключи :D
-
Чувак, ты настоящий программист - твой ответ вроде правильный, но бесполезный.
* я не применил, чтобы не вываливать лишние поля, их там дофига
Если бы я работал с курсорами - я бы не искал знатоков сиквела. Да и вообще, я не программер.
да, эта таблица не догма, но она промежуточна, получена в результате джойнов из двух вьюшек.
Итак повторяю вопрос: как упорядочить вывод родитель-потомок.
Упрощу табличку ))
idparent id namedse obozn typ kol
4422 4424 Деталь корневой сборки 000.000.001 Деталь 3
4422 4487 Вторая деталь корневой сборки 000.000.002 Деталь 1
4423 4425 Деталь подсборки 1 000.001.001 Деталь 1
4431 4432 Деталь подсборки второго уровня 000.001.001.000 Деталь 1
4423 4431 Подсборка 2-го уровня 000.001.001СБ Сборочная единица 1
4422 4423 Подсборка 1 уровня 000.001СБ Сборочная единица 1
4474 4475 Деталь второй подсборки 1-го уровня 000.002.001 Деталь 1
4431 4481 Подсборка третьего уровня 000.002.002 СБ Сборочная единица 1
4481 4482 Деталь подсборки третьего уровня 000.002-001 Деталь 1
4422 4474 Вторая подсборка 1-го уровня 000.002СБ Сборочная единица 1
1 4422 Корневая сборка 000_СБ Сборочная единица 1
Как бы хотелось:
Корневая сборка (ее idparent будет всегда 1)
Детали корневой сборки idparent=id корневой сборки
Подсборка первого уровня ее idparent = id корневой сборки
Детали подсборки первого уровня их idparent = id корневой сборки
Подсборка второго уровня
детали...
и т.д.
Вторая сборка 1-го уровня...
...
И чтобы было совсем понятно, что требуется :)
(http://storage8.static.itmages.ru/i/15/1010/h_1444480666_4167899_e8c15c92c3.png)
-
я не применил, чтобы не вываливать лишние поля, их там дофига
Ну так пардон - лишние, или нет - это уже виднее тому, кто запрос напишет :) Тем более, что ты просто материализуешь данные вьюшками, а parentid, который наконец-то появился, который был предсказан - это для простого алгоритма обхода графов. Написал бы вчера подробно - вчера бы тебе и запрос прислали. Если никто не ответит - отпишу тебе завтра.
-
UPD: вот пока обувался - появилась такая мысль, но, если ты не программер - то она бесполезна в данном контексте: есть множество трехсторонних UI компонентов (типа https://demos.devexpress.com/ASPxTreeListDemos/Overview.aspx), которые сами умеют разворачивать иерархию в дерево, просто на основании полей id и idparent - левым мизинцем правой ноги :D
-
Итак, покурив BOL сделана попытка прорыва
with Rec (parentid, childid, name, level_,typ) As
(select t.idparent, t.id, t.namedse, 0, t.typ from sostav_test1 t where t.idparent = 1
union all
select t.idparent, t.id, t.namedse, Rec.level_+1,t.typ
from sostav_test1 t inner join Rec on (t.idparent = Rec.childid))
select replicate(char(160), 2*level_) + name [Состав по иерархии],typ [Тип ДСЕ] from Re
Результат пока не очень.
Состав по иерархии Тип ДСЕ
Корневая сборка Сборочная единица
Деталь корневой сборки Деталь
Вторая деталь корневой сборки Деталь
Подсборка 1 уровня Сборочная единица
Вторая подсборка 1-го уровня Сборочная единица
Деталь второй подсборки 1-го уровня Деталь
Деталь подсборки 1 Деталь
Подсборка 2-го уровня Сборочная единица
Деталь подсборки второго уровня Деталь
Подсборка третьего уровня Сборочная единица
Деталь подсборки третьего уровня Деталь
-
Упрощу табличку ))
Enakievo, dmp прав -у тебя мусорник из данных.
Давай-ка не будем "упрощать табличку", а немного расширим вводную информацию.
Контекст задачи? Ты работаешь с уже существующей базой или ты ее рисуешь сам?
Что тебе отдают вьюхи? какова точная структура таблиц, ну или вьюх, если у тебя нет прав на работу с таблицами?
Вообще иерархия такого типа - это стандартная задача. И большинство разработчиков закладывает в структуру базы что-то, что облегчит гемморой работы с ней и позволит повысить производительность при выборках. Чаще всего это IDRecord - собственно идентификатор записи, ParentID - ссылка на прямого родителя, MainParentID - ссылка на корень иерархии для быстрого выбора всех потомков, LevelNum - уровень вложенности текущей записи, NumInCurLevel - порядковый номер в текущей ветке, так же может быть ID промежуточной иерархии - в данном случае это мог бы быть ID вложенной сборки. Иногда делают текстовое поле именно для сортировки в выборках и контролируют его триггерами. Вобщем вариантов - тыщщи их.
Имхо, по тем данным, которые ты показал, не получится красиво сделать выборку. Только обрабатывать хранимой процедурой, добавлять какой-то признак сортировки искусственно, и наполнять получившимися данными временную табличку, откуда затем выгребать и сортировать набор данных для клиента.
Поэтому еще раз - каков полный контекст задачи?
-
Работаю с сущ. базой, менять структуру таблиц нельзя
Вьюшек всего три
Первая содержит связи - выборку по IdParent, IdChild,количество (связи количественные), тип связи (например "Состоит из", т.е. сборка состоит из деталей)
Вторая - Id объекта, его обозначение, тип (деталь, сборка...), дата создания
Третья - содержит атрибуты (имя атрибута, Id объекта, которому принадлежит атрибут, значение атрибута)
MainParentID - ссылка на корень иерархии для быстрого выбора всех потомков, LevelNum - уровень вложенности текущей записи, NumInCurLevel - порядковый номер в текущей ветке, так же может быть ID промежуточной иерархии - в данном случае это мог бы быть ID вложенной сборки. Иногда делают текстовое поле именно для сортировки в выборках и контролируют его триггерами. Вобщем вариантов - тыщщи их.
Имхо, по тем данным, которые ты показал, не получится красиво сделать выборку. Только обрабатывать хранимой процедурой, добавлять какой-то признак сортировки искусственно, и наполнять получившимися данными временную табличку, откуда затем выгребать и сортировать набор данных для клиента.
Такого нет. И вряд ли может быть, хотя бы потому, что объект может иметь входимость в разные сборки.
Если бы эти данные имелись - то задача бы решена была давно.
Да мне хоть как, красиво или не красиво. Доступ на создание ХП имеется, если что.
Контекст задачи - получить таблицу с данными
Как бы хотелось:
Корневая сборка (ее idparent будет всегда 1)
Детали корневой сборки idparent=id корневой сборки
Подсборка первого уровня ее idparent = id корневой сборки
Детали подсборки первого уровня их idparent = id корневой сборки
Подсборка второго уровня
детали...
и т.д.
Вторая сборка 1-го уровня...
-
Чувак, исходя из того, что ты исходными данными кормишь по чайной ложке (то у тебя новые вьюшки, то у тебя новые поля) - вот тебе и ответ с честно развернутой иерархией, все, что тут можно сделать запросом, под данным, которые ты тут выложил:
select
t2.id
, t2.idparent
, t2.namedse
, t2.typ
from _enakievo t1
join _enakievo t2
on t1.id = t2.idparent
order by t2.idparent, t2.typ
:D
4424 4422 Деталь корневой сборки Деталь
4487 4422 Вторая деталь корневой сборки Деталь
4423 4422 Подсборка 1 уровня Сборочная единица
4474 4422 Вторая подсборка 1-го уровня Сборочная единица
4425 4423 Деталь подсборки 1 Деталь
4431 4423 Подсборка 2-го уровня Сборочная единица
4432 4431 Деталь подсборки второго уровня Деталь
4481 4431 Подсборка третьего уровня Сборочная единица
4475 4474 Деталь второй подсборки 1-го уровня Деталь
4482 4481 Деталь подсборки третьего уровня Деталь
И имей ввиду, что задача визуализации данных один к одному - это совсем не задача SQL сервера, не стоит его насиловать.
И картинка совсем как-бы не соответствует тому, что ты запрашиваешь, глянь внимательно. А твой запрос с common table expressions, я так понял - ковноиндент не соответствует - поле level_ свое посмотри: там отступ - от корневого элемента наверняка.
Доступ на создание ХП имеется, если что.
Либо пиши тогда курсорами, либо давай все, что есть (в Management Studio тыц правой кнопкой на таблицу, Dependencies, и все значимые связи с данными в студию)
Или бэкап базы выкладывай, если ее вкурить не можешь :D
-
Все, вопрос решен. Разобрался с курсорами - верно, удобная штука.
Жизнь заставит - и на безрыбье раком станешь :lol:
Спасибо, что приняли участие. Нормальное ТЗ - половина успеха.
Результат:
parentid childid name typ
1 4422 Корневая сборка Сборочная единица
4422 4424 Деталь корневой сборки Деталь
4422 4487 Вторая деталь корневой сборки Деталь
4422 4423 Подсборка 1 уровня Сборочная единица
4423 4425 Деталь подсборки 1 Деталь
4422 4474 Вторая подсборка 1-го уровня Сборочная единица
4474 4475 Деталь второй подсборки 1-го уровня Деталь
4423 4431 Подсборка 2-го уровня Сборочная единица
4431 4432 Деталь подсборки второго уровня Деталь
4431 4481 Подсборка третьего уровня Сборочная единица
4481 4482 Деталь подсборки третьего уровня Деталь
А твой запрос с common table expressions, я так понял - ковноиндент не соответствует - поле level_ свое посмотри: там отступ - от корневого элемента наверняка.
дзен-программист, ну что тебе не нравится? да, отступ от корневой сборки, и шо?
-
а то, что ты делаешь ненужную денормализацию, целостность которой ничем не обеспечишь (можно, конечно, ее обеспечить триггером, но в этом случае будут две проблемы: целостность данных, и триггер :D чуть в триггере ошибся - транзакция будет откатываться)
вот ты вставишь новую сущность внутрь иерархии - уровни нижеследующих сущностей будешь пересчитывать? та даже если отсчитывать уровень от парента - делать то-же самое, только данных перелопачивать меньше
-
а то, что ты делаешь ненужную денормализацию, целостность которой ничем не обеспечишь (можно, конечно, ее обеспечить триггером, но в этом случае будут две проблемы: целостность данных, и триггер :D чуть в триггере ошибся - транзакция будет откатываться)
вот ты вставишь новую сущность внутрь иерархии - уровни нижеследующих сущностей будешь пересчитывать? та даже если отсчитывать уровень от парента - делать то-же самое, только данных перелопачивать меньше
Да все равно. Время жизни той таблички... это ж бабл-гам скелет для отчета
Может в следующей жизни, например, я в листбокс захочу этот датасет втулить, к примеру, а он уже с готовыми смещениями, красиво, типо :)
-
Может в следующей жизни, например, я в листбокс захочу этот датасет втулить, к примеру, а он уже с готовыми смещениями, красиво, типо
У меня ощущение, будто ты недавно с ms access перешел на sql server )
Не листбокс, а treeview нужен, который умеет распахивать иерархию - я ж писал. Там вообще возиться не нужно - по id и idparent сам визуализирует распахивающуюся иерархию, и отступы сделает - четко, как ты картинку прикладывал
-
а treeview нужен, который умеет распахивать иерархию - я ж писал.
Я ж и говорю - в следующей жизни. Когда стану программистом :)