Форум Краматорська

Краматорськ та світ навколо нас => Компьютеры, мобилки, софт, Интернет, провайдеры => Тема розпочата: Enakievo від 09 Жовтня 2015, 16:36:52

Назва: Есть ли знатоки SQL (T-SQL)?
Відправлено: Enakievo від 09 Жовтня 2015, 16:36:52
Есть задачка, нужна помощь
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: ne4uparuk від 09 Жовтня 2015, 17:21:59
Давай!
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: dmp від 09 Жовтня 2015, 18:56:34
Пости сюда
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: Elemental від 09 Жовтня 2015, 19:00:28
Есть.
Ответ на вопрос топикстартера дан, тему можно закрывать :D




Так где задачка-то?
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: Enakievo від 09 Жовтня 2015, 20:33:38
Помогите правильно написать запрос
Код: [Select]
select
COUNT(*),namedse,headtyp,label
from sostav_tp
group by label,namedse,headtyp
Группирующий по некоему общему признаку label
Результат этого запроса:
Код: [Select]
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. Но пока не выходит  :)
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: dmp від 09 Жовтня 2015, 21:57:04
Это был вопрос, или ответ? Или вопрос с ответом? :) потому что resultset вроде похож на правду, а вот
Цитувати
Группирующий по некоему общему признаку label
у тебя-то подсчитывает количество по уникальным комбинациям label,namedse,headtyp, а не
Цитувати
Группирующий по некоему общему признаку label
p.s. По-хорошему, вопрос нужно оформлять с исходными данными, и что должно быть на выходе (resultset). А так ощущение, что дал неправильный запрос, и его нужно пофиксить. Если так - то ощущение, что там нужно делать декартово произведение по label (full join). Но лучше напиши контрольный пример - так будет быстрее, т.к. телепаты в отпуске
p.p.s. У тебя в таблице - древовидная структура "сборка-деталь"? Каким образом описаны в таблице эти связи (корневая понятно - null в label, а дальше как идет ветвление, и какой признак сборки/детали?) Ты, небось, не все поля нам показал
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: dmp від 09 Жовтня 2015, 22:22:04
В общем, нужно знать, как строится дерево по таблице sostav_tp - сейчас недостаточно данных чтобы определить, какая деталь принадлежит какой подсборке
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: dmp від 09 Жовтня 2015, 22:43:09
Какая-то хрень у тебя с исходными данными: 3 одинаковые корневые сборки (корневой элемент он всегда один, по определению - на то он и корневой, уровни иерархии - только корневые сборки - подсборки на одном уровне, непонятно как сопоставляемые с корневой сборкой, детали подсборки на одном уровне. При чем тут "Подсборка первого уровня", "Подсборка второго уровня". Короче, хрен поймешь модель твоих данных.
Это сейчас такие задачи профессура дает студентам? Или студенты так хорошо делают дизайн объектов в базе данных? Явно не хватает некого ParentID, в простейшем виде, или отдельной таблички, чтобы не нарушить целостность данных, с полями ParentID - ChildID, тогда можно было бы написать красивый запрос
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: masters від 09 Жовтня 2015, 23:50:32
Явно не хватает некого ParentID, в простейшем виде, или отдельной таблички, чтобы не нарушить целостность данных, с полями ParentID - ChildID, тогда можно было бы написать красивый запрос

+1
В данном виде ничего не получится.
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: dmp від 10 Жовтня 2015, 00:05:49
Вот напиши, как у тебя разворачивается иерархия. Потому что иерархия сборка - деталь вроде этот ужас уже понятен, а вот как сборка привинчена к корневой записи - у корневой-то label is null
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: Enakievo від 10 Жовтня 2015, 08:10:24
Вот напиши, как у тебя разворачивается иерархия. Потому что иерархия сборка - деталь вроде этот ужас уже понятен, а вот как сборка привинчена к корневой записи - у корневой-то label is null
да, пожалуй я сам намутил и в этом же запутался.
label можно вообще забыть. вот вся таблица
Код: [Select]
select headid,iddse,obozndse,namedse,oper from sostav_tp
Код: [Select]
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 произвольный
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: dmp від 10 Жовтня 2015, 13:34:51
Цитувати
вот вся таблица
Всю таблицу вообще-то можно увидеть через select * from sostav_tp

Посмотри внимательно на свои данные - 3 корневые сущности, абсолютно одинаковые. Сущность "Подсборка 1 уровня   Развальцовка" с какой именно сопоставляется, а?
Исходя из того, что у тебя не база данных, а свалка данных - делай хранимку, в ней перебирай курсором (создаешь временную таблицу @sostav_tp, с такой же структурой, курсором разворачиваешь иерархию вниз, как тебе нужно, вставляешь записи во временную таблицу, в оконцовке делаешь select * from @sostav_tp и будет тебе счастье)
p.s. Есть 2 типа T-SQL разработчиков: те, которые используют суррогатные ключи, и те, которые уже используют суррогатные ключи  :D
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: Enakievo від 10 Жовтня 2015, 15:25:14
Чувак, ты настоящий программист - твой ответ вроде правильный, но бесполезный.
* я не применил, чтобы не вываливать лишние поля, их там дофига
Если бы я работал с курсорами - я бы не искал знатоков сиквела. Да и вообще, я не программер.
да, эта таблица не догма, но она промежуточна, получена в результате джойнов из двух вьюшек.

Итак повторяю вопрос: как упорядочить вывод родитель-потомок.
Упрощу табличку ))

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)
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: dmp від 10 Жовтня 2015, 15:48:12
Цитувати
я не применил, чтобы не вываливать лишние поля, их там дофига
Ну так пардон - лишние, или нет - это уже виднее тому, кто запрос напишет :) Тем более, что ты просто материализуешь данные вьюшками, а parentid, который наконец-то появился, который был предсказан - это для простого алгоритма обхода графов. Написал бы вчера подробно - вчера бы тебе и запрос прислали. Если никто не ответит - отпишу тебе завтра.
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: dmp від 10 Жовтня 2015, 16:08:55
UPD: вот пока обувался - появилась такая мысль, но, если ты не программер - то она бесполезна в данном контексте: есть множество трехсторонних UI компонентов (типа https://demos.devexpress.com/ASPxTreeListDemos/Overview.aspx), которые сами умеют разворачивать иерархию в дерево, просто на основании полей id и idparent - левым мизинцем правой ноги  :D
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: Enakievo від 10 Жовтня 2015, 19:10:00
Итак, покурив BOL сделана попытка прорыва
Код: [Select]
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
Результат пока не очень.
Код: [Select]
Состав по иерархии Тип ДСЕ
Корневая сборка Сборочная единица
  Деталь корневой сборки Деталь
  Вторая деталь корневой сборки Деталь
  Подсборка 1 уровня Сборочная единица
  Вторая подсборка 1-го уровня Сборочная единица
    Деталь второй подсборки 1-го уровня Деталь
    Деталь подсборки 1 Деталь
    Подсборка 2-го уровня Сборочная единица
      Деталь подсборки второго уровня Деталь
      Подсборка третьего уровня Сборочная единица
        Деталь подсборки третьего уровня Деталь
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: Elemental від 11 Жовтня 2015, 16:52:51
Упрощу табличку ))

Enakievo, dmp прав  -у тебя мусорник из данных.
Давай-ка не будем "упрощать табличку", а немного расширим вводную информацию.
Контекст задачи? Ты работаешь с уже существующей базой или ты ее рисуешь сам?
Что тебе отдают вьюхи? какова точная структура таблиц, ну или вьюх, если у тебя нет прав на работу с таблицами?

Вообще иерархия такого типа - это стандартная задача. И большинство разработчиков закладывает в структуру базы что-то, что облегчит гемморой работы с ней и позволит повысить производительность при выборках. Чаще всего это IDRecord - собственно идентификатор записи, ParentID - ссылка на прямого родителя, MainParentID - ссылка на корень иерархии для быстрого выбора всех потомков, LevelNum - уровень вложенности текущей записи, NumInCurLevel - порядковый номер в текущей ветке,  так же может быть ID промежуточной иерархии - в данном случае это мог бы быть ID вложенной сборки. Иногда делают текстовое поле именно для сортировки в выборках и контролируют его триггерами. Вобщем вариантов - тыщщи их.
Имхо, по тем данным, которые ты показал, не получится красиво сделать выборку. Только обрабатывать хранимой процедурой, добавлять какой-то признак сортировки искусственно, и наполнять получившимися данными временную табличку, откуда затем выгребать и сортировать набор данных для клиента.

Поэтому еще раз - каков полный контекст задачи?


Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: Enakievo від 11 Жовтня 2015, 19:07:30
Работаю с сущ. базой, менять структуру таблиц нельзя
Вьюшек всего три
Первая содержит связи - выборку по IdParent, IdChild,количество (связи количественные), тип связи (например "Состоит из", т.е. сборка состоит из деталей)
Вторая - Id объекта, его обозначение, тип (деталь, сборка...), дата создания
Третья - содержит атрибуты (имя атрибута, Id объекта, которому принадлежит атрибут, значение атрибута)
Цитувати
MainParentID - ссылка на корень иерархии для быстрого выбора всех потомков, LevelNum - уровень вложенности текущей записи, NumInCurLevel - порядковый номер в текущей ветке,  так же может быть ID промежуточной иерархии - в данном случае это мог бы быть ID вложенной сборки. Иногда делают текстовое поле именно для сортировки в выборках и контролируют его триггерами. Вобщем вариантов - тыщщи их.
Имхо, по тем данным, которые ты показал, не получится красиво сделать выборку. Только обрабатывать хранимой процедурой, добавлять какой-то признак сортировки искусственно, и наполнять получившимися данными временную табличку, откуда затем выгребать и сортировать набор данных для клиента.
Такого нет. И вряд ли может быть, хотя бы потому, что объект может иметь входимость в разные сборки.
Если бы эти данные имелись - то задача бы решена была давно.
Да мне хоть как, красиво или не красиво. Доступ на создание ХП имеется, если что.
Контекст задачи - получить таблицу с данными
Цитувати
Как бы хотелось:
Корневая сборка (ее idparent будет всегда 1)
Детали корневой сборки idparent=id корневой сборки
Подсборка первого уровня ее idparent = id корневой сборки
Детали подсборки первого уровня их idparent = id корневой сборки
Подсборка второго уровня
детали...
и т.д.
Вторая сборка 1-го уровня...
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: dmp від 11 Жовтня 2015, 19:47:43
Чувак, исходя из того, что ты исходными данными кормишь по чайной ложке (то у тебя новые вьюшки, то у тебя новые поля) - вот тебе и ответ с честно развернутой иерархией, все, что тут можно сделать запросом, под данным, которые ты тут выложил:

Код: [Select]
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

Код: [Select]
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
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: Enakievo від 13 Жовтня 2015, 06:49:18
Все, вопрос решен. Разобрался с курсорами - верно, удобная штука.
Жизнь заставит - и на безрыбье раком станешь  :lol:
Спасибо, что приняли участие. Нормальное ТЗ - половина успеха.
Результат:
Код: [Select]
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_ свое посмотри: там отступ - от корневого элемента наверняка.
дзен-программист, ну что тебе не нравится? да, отступ от корневой сборки, и шо?
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: dmp від 13 Жовтня 2015, 12:50:08
а то, что ты делаешь ненужную денормализацию, целостность которой ничем не обеспечишь (можно, конечно, ее обеспечить триггером, но в этом случае будут две проблемы: целостность данных, и триггер  :D чуть в триггере ошибся - транзакция будет откатываться)
вот ты вставишь новую сущность внутрь иерархии - уровни нижеследующих сущностей будешь пересчитывать? та даже если отсчитывать уровень от парента - делать то-же самое, только данных перелопачивать меньше
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: Enakievo від 13 Жовтня 2015, 13:09:27
а то, что ты делаешь ненужную денормализацию, целостность которой ничем не обеспечишь (можно, конечно, ее обеспечить триггером, но в этом случае будут две проблемы: целостность данных, и триггер  :D чуть в триггере ошибся - транзакция будет откатываться)
вот ты вставишь новую сущность внутрь иерархии - уровни нижеследующих сущностей будешь пересчитывать? та даже если отсчитывать уровень от парента - делать то-же самое, только данных перелопачивать меньше
Да все равно. Время жизни той таблички... это ж бабл-гам скелет для отчета
Может в следующей жизни, например, я в листбокс захочу этот датасет втулить, к примеру, а он уже с готовыми смещениями, красиво, типо  :)
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: dmp від 13 Жовтня 2015, 13:16:56
Цитувати
Может в следующей жизни, например, я в листбокс захочу этот датасет втулить, к примеру, а он уже с готовыми смещениями, красиво, типо
У меня ощущение, будто ты недавно с ms access перешел на sql server )
Не листбокс, а treeview нужен, который умеет распахивать иерархию - я ж писал. Там вообще возиться не нужно - по id и idparent сам визуализирует распахивающуюся иерархию, и отступы сделает - четко, как ты картинку прикладывал
Назва: Re: Есть ли знатоки SQL (T-SQL)?
Відправлено: Enakievo від 13 Жовтня 2015, 13:21:19
Цитувати
а treeview нужен, который умеет распахивать иерархию - я ж писал.
Я ж и говорю - в следующей жизни. Когда стану программистом  :)