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

  • 30 Квітень 2024, 01:48:27
  • Ласкаво Просимо, Гість
Будь ласка увійдіть або зареєструйтесь.

Увійти

Новини:

Автор Тема: Есть ли знатоки SQL (T-SQL)?  (Прочитано 3185 раз)

0 Користувачів і 1 Гість дивляться цю тему.

09 Жовтень 2015, 16:36:52
Прочитано 3185 раз
Offline

Enakievo


Offline Enakievo

  • ****
  • Старожил
  • Повідомлень: 2858
  • Країна: so
  • Карма: +159/-3
  • Дякую
  • Сказав: 218
  • Отримав: 585
    • Чоловіча
    • Перегляд профілю
Есть задачка, нужна помощь
Рабский ум создан таким образом, что не придает никакого значения событиям, если они не закреплены кровью.

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

Есть ли знатоки SQL (T-SQL)?
« : 09 Жовтень 2015, 16:36:52 »

09 Жовтень 2015, 17:21:59
Відповідь #1
Offline

ne4uparuk


Offline ne4uparuk

  • *****
  • Ветеран
  • Повідомлень: 4245
  • Країна: ua
  • Карма: +130/-8
  • Дякую
  • Сказав: 476
  • Отримав: 487
    • Чоловіча
    • Перегляд профілю

09 Жовтень 2015, 18:56:34
Відповідь #2
Offline

dmp


Offline dmp

  • ЮРИЙ_ТАМАРА_8_ИВАН_БОРИС_АНТОН
  • ****
  • Старожил
  • Повідомлень: 1511
  • Країна: ua
  • Карма: +45/-28
  • Дякую
  • Сказав: 111
  • Отримав: 96
    • Чоловіча
    • Перегляд профілю
Arbeit macht frei
--------------------
Каждая строка кода на C++ выглядит как боль программиста, напечатанная словами

09 Жовтень 2015, 19:00:28
Відповідь #3
Offline

Elemental


Offline Elemental

  • **
  • Завсегдатай
  • Повідомлень: 210
  • Карма: +5/-0
  • Дякую
  • Сказав: 69
  • Отримав: 20
    • Чоловіча
    • Перегляд профілю
Есть.
Ответ на вопрос топикстартера дан, тему можно закрывать :D




Так где задачка-то?

09 Жовтень 2015, 20:33:38
Відповідь #4
Offline

Enakievo


Offline Enakievo

  • ****
  • Старожил
  • Повідомлень: 2858
  • Країна: so
  • Карма: +159/-3
  • Дякую
  • Сказав: 218
  • Отримав: 585
    • Чоловіча
    • Перегляд профілю
Помогите правильно написать запрос
Код: [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. Но пока не выходит  :)
Рабский ум создан таким образом, что не придает никакого значения событиям, если они не закреплены кровью.

09 Жовтень 2015, 21:57:04
Відповідь #5
Offline

dmp


Offline dmp

  • ЮРИЙ_ТАМАРА_8_ИВАН_БОРИС_АНТОН
  • ****
  • Старожил
  • Повідомлень: 1511
  • Країна: ua
  • Карма: +45/-28
  • Дякую
  • Сказав: 111
  • Отримав: 96
    • Чоловіча
    • Перегляд профілю
Это был вопрос, или ответ? Или вопрос с ответом? :) потому что resultset вроде похож на правду, а вот
Цитувати
Группирующий по некоему общему признаку label
у тебя-то подсчитывает количество по уникальным комбинациям label,namedse,headtyp, а не
Цитувати
Группирующий по некоему общему признаку label
p.s. По-хорошему, вопрос нужно оформлять с исходными данными, и что должно быть на выходе (resultset). А так ощущение, что дал неправильный запрос, и его нужно пофиксить. Если так - то ощущение, что там нужно делать декартово произведение по label (full join). Но лучше напиши контрольный пример - так будет быстрее, т.к. телепаты в отпуске
p.p.s. У тебя в таблице - древовидная структура "сборка-деталь"? Каким образом описаны в таблице эти связи (корневая понятно - null в label, а дальше как идет ветвление, и какой признак сборки/детали?) Ты, небось, не все поля нам показал
Arbeit macht frei
--------------------
Каждая строка кода на C++ выглядит как боль программиста, напечатанная словами

09 Жовтень 2015, 22:22:04
Відповідь #6
Offline

dmp


Offline dmp

  • ЮРИЙ_ТАМАРА_8_ИВАН_БОРИС_АНТОН
  • ****
  • Старожил
  • Повідомлень: 1511
  • Країна: ua
  • Карма: +45/-28
  • Дякую
  • Сказав: 111
  • Отримав: 96
    • Чоловіча
    • Перегляд профілю
В общем, нужно знать, как строится дерево по таблице sostav_tp - сейчас недостаточно данных чтобы определить, какая деталь принадлежит какой подсборке
Arbeit macht frei
--------------------
Каждая строка кода на C++ выглядит как боль программиста, напечатанная словами

09 Жовтень 2015, 22:43:09
Відповідь #7
Offline

dmp


Offline dmp

  • ЮРИЙ_ТАМАРА_8_ИВАН_БОРИС_АНТОН
  • ****
  • Старожил
  • Повідомлень: 1511
  • Країна: ua
  • Карма: +45/-28
  • Дякую
  • Сказав: 111
  • Отримав: 96
    • Чоловіча
    • Перегляд профілю
Какая-то хрень у тебя с исходными данными: 3 одинаковые корневые сборки (корневой элемент он всегда один, по определению - на то он и корневой, уровни иерархии - только корневые сборки - подсборки на одном уровне, непонятно как сопоставляемые с корневой сборкой, детали подсборки на одном уровне. При чем тут "Подсборка первого уровня", "Подсборка второго уровня". Короче, хрен поймешь модель твоих данных.
Это сейчас такие задачи профессура дает студентам? Или студенты так хорошо делают дизайн объектов в базе данных? Явно не хватает некого ParentID, в простейшем виде, или отдельной таблички, чтобы не нарушить целостность данных, с полями ParentID - ChildID, тогда можно было бы написать красивый запрос
Arbeit macht frei
--------------------
Каждая строка кода на C++ выглядит как боль программиста, напечатанная словами

09 Жовтень 2015, 23:50:32
Відповідь #8
Offline

masters


Offline masters

  • masters
  • ****
  • Старожил
  • Повідомлень: 1138
  • Країна: tk
  • Карма: +8/-1
  • Дякую
  • Сказав: 1
  • Отримав: 27
    • Чоловіча
    • Перегляд профілю
Явно не хватает некого ParentID, в простейшем виде, или отдельной таблички, чтобы не нарушить целостность данных, с полями ParentID - ChildID, тогда можно было бы написать красивый запрос

+1
В данном виде ничего не получится.

10 Жовтень 2015, 00:05:49
Відповідь #9
Offline

dmp


Offline dmp

  • ЮРИЙ_ТАМАРА_8_ИВАН_БОРИС_АНТОН
  • ****
  • Старожил
  • Повідомлень: 1511
  • Країна: ua
  • Карма: +45/-28
  • Дякую
  • Сказав: 111
  • Отримав: 96
    • Чоловіча
    • Перегляд профілю
Вот напиши, как у тебя разворачивается иерархия. Потому что иерархия сборка - деталь вроде этот ужас уже понятен, а вот как сборка привинчена к корневой записи - у корневой-то label is null
Arbeit macht frei
--------------------
Каждая строка кода на C++ выглядит как боль программиста, напечатанная словами

10 Жовтень 2015, 08:10:24
Відповідь #10
Offline

Enakievo


Offline Enakievo

  • ****
  • Старожил
  • Повідомлень: 2858
  • Країна: so
  • Карма: +159/-3
  • Дякую
  • Сказав: 218
  • Отримав: 585
    • Чоловіча
    • Перегляд профілю
Вот напиши, как у тебя разворачивается иерархия. Потому что иерархия сборка - деталь вроде этот ужас уже понятен, а вот как сборка привинчена к корневой записи - у корневой-то 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 произвольный
Рабский ум создан таким образом, что не придает никакого значения событиям, если они не закреплены кровью.

10 Жовтень 2015, 13:34:51
Відповідь #11
Offline

dmp


Offline dmp

  • ЮРИЙ_ТАМАРА_8_ИВАН_БОРИС_АНТОН
  • ****
  • Старожил
  • Повідомлень: 1511
  • Країна: ua
  • Карма: +45/-28
  • Дякую
  • Сказав: 111
  • Отримав: 96
    • Чоловіча
    • Перегляд профілю
Цитувати
вот вся таблица
Всю таблицу вообще-то можно увидеть через select * from sostav_tp

Посмотри внимательно на свои данные - 3 корневые сущности, абсолютно одинаковые. Сущность "Подсборка 1 уровня   Развальцовка" с какой именно сопоставляется, а?
Исходя из того, что у тебя не база данных, а свалка данных - делай хранимку, в ней перебирай курсором (создаешь временную таблицу @sostav_tp, с такой же структурой, курсором разворачиваешь иерархию вниз, как тебе нужно, вставляешь записи во временную таблицу, в оконцовке делаешь select * from @sostav_tp и будет тебе счастье)
p.s. Есть 2 типа T-SQL разработчиков: те, которые используют суррогатные ключи, и те, которые уже используют суррогатные ключи  :D
Arbeit macht frei
--------------------
Каждая строка кода на C++ выглядит как боль программиста, напечатанная словами

10 Жовтень 2015, 15:25:14
Відповідь #12
Offline

Enakievo


Offline Enakievo

  • ****
  • Старожил
  • Повідомлень: 2858
  • Країна: so
  • Карма: +159/-3
  • Дякую
  • Сказав: 218
  • Отримав: 585
    • Чоловіча
    • Перегляд профілю
Чувак, ты настоящий программист - твой ответ вроде правильный, но бесполезный.
* я не применил, чтобы не вываливать лишние поля, их там дофига
Если бы я работал с курсорами - я бы не искал знатоков сиквела. Да и вообще, я не программер.
да, эта таблица не догма, но она промежуточна, получена в результате джойнов из двух вьюшек.

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

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-го уровня...
...
И чтобы было совсем понятно, что требуется  :)

Рабский ум создан таким образом, что не придает никакого значения событиям, если они не закреплены кровью.

10 Жовтень 2015, 15:48:12
Відповідь #13
Offline

dmp


Offline dmp

  • ЮРИЙ_ТАМАРА_8_ИВАН_БОРИС_АНТОН
  • ****
  • Старожил
  • Повідомлень: 1511
  • Країна: ua
  • Карма: +45/-28
  • Дякую
  • Сказав: 111
  • Отримав: 96
    • Чоловіча
    • Перегляд профілю
Цитувати
я не применил, чтобы не вываливать лишние поля, их там дофига
Ну так пардон - лишние, или нет - это уже виднее тому, кто запрос напишет :) Тем более, что ты просто материализуешь данные вьюшками, а parentid, который наконец-то появился, который был предсказан - это для простого алгоритма обхода графов. Написал бы вчера подробно - вчера бы тебе и запрос прислали. Если никто не ответит - отпишу тебе завтра.
Arbeit macht frei
--------------------
Каждая строка кода на C++ выглядит как боль программиста, напечатанная словами

10 Жовтень 2015, 16:08:55
Відповідь #14
Offline

dmp


Offline dmp

  • ЮРИЙ_ТАМАРА_8_ИВАН_БОРИС_АНТОН
  • ****
  • Старожил
  • Повідомлень: 1511
  • Країна: ua
  • Карма: +45/-28
  • Дякую
  • Сказав: 111
  • Отримав: 96
    • Чоловіча
    • Перегляд профілю
UPD: вот пока обувался - появилась такая мысль, но, если ты не программер - то она бесполезна в данном контексте: есть множество трехсторонних UI компонентов (типа https://demos.devexpress.com/ASPxTreeListDemos/Overview.aspx), которые сами умеют разворачивать иерархию в дерево, просто на основании полей id и idparent - левым мизинцем правой ноги  :D
Arbeit macht frei
--------------------
Каждая строка кода на C++ выглядит как боль программиста, напечатанная словами

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

Re: Есть ли знатоки SQL (T-SQL)?
« Відповідь #14 : 10 Жовтень 2015, 16:08:55 »