Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
|
|||
|---|---|---|---|
|
#18+
Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64) Aug 22 2017 17:04:49 Copyright (C) 2017 Microsoft Corporation Express Edition (64-bit) on Windows 10 Home Single Language 10.0 <X64> (Build 16299: ) Уважаемые знатоки! Довольно нетривиальная (или мне так кажется..) задача. Есть данные посещения занятий в учебном заведении: Код: sql 1. 2. 3. 4. 5. Таблица Client содержит данные об учениках. Таблица Lessons имеет примерно такой вид: Код: sql 1. 2. 3. 4. 5. И из этих данных необходимо получить ведомость посещения с за определённый месяц и в определённой группе примерно такого вида: Client2018-06-012018-06-042018-06-12Jhon Doe111Jane Doe001Alex Mills011Andy Coin101 В общем, как в школьном журнале. В связи с этим два вопроса: 1) Я вполне себе представляю, как я могу переработать информацию из БД, чтобы получить искомую таблицу на стороне клиента (с#). Но может быть можно каким-то образом делать это на стороне сервера? Средствами T-SQL? 2) Возможно, кто-то может посоветовать другую схему таблиц для хранения этих данных, чтобы получить искомый результат было легче? Опыта работы с БД нет, но есть производственная необходимость.. Всё делается по наитию. Буду благодарен не только за готовое решение, но и вообще за любую наводку на плодотворную мысль. Заранее благодарен! С уважением, Сергей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2018, 19:06 |
|
||
|
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
|
|||
|---|---|---|---|
|
#18+
Однозначно делать на стороне клиента. Можете и на стороне SQL Server'a, конечно, PIVOT вам в помощь. Просто вы наверняка захотите dynamic pivot, это тоже возможно, но нафиг такой гемор творить на стороне SQL - не совсем понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2018, 19:55 |
|
||
|
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
|
|||
|---|---|---|---|
|
#18+
eonae ведомость посещения с за определённый месяц и в определённой группе примерно такого вида: Client2018-06-012018-06-042018-06-12Jhon Doe111Jane Doe001Alex Mills011Andy Coin101 В общем, как в школьном журнале. Таки лучше подумать и написать кошерно. CREATE TABLE Visits (VisitID [int] IDENTITY(1,1) PRIMARY KEY CLUSTERED, LessonID [int] FOREIGN KEY (ClientID) REFERENCES Lessons (LessonID) ClientID [int] FOREIGN KEY (LessonID) REFERENCES Clients (ClientID) Status [bit] NOT NULL) -- 0 - не был, 1 - был Начните со списка Clients, присоединив к нему через cross join выборку ВСЕХ дат из таблицы дат. Ну или до максимальной даты LessonDate для выбранного месяца из таблицы Lessons. А уже потом на пересечении ученика и даты выбирайте нужные значения из Visits. Хотя бы потом, что пересечение ученика и даты может дать несколько разных записей в Lessons - и я никак не пойму, почему Вы в ведомости рисуете 0 и 1. А если уроков должно было быть 5, а ученик посетил только 4? Или Вам нужно, чтобы он посетил хотя бы один урок из выбранной даты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2018, 20:15 |
|
||
|
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
|
|||
|---|---|---|---|
|
#18+
Andy_OLAP, Поправлю таки сам себя - присоединив через cross join выборку всех даты выбранного для ведомости месяца. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2018, 20:16 |
|
||
|
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
|
|||
|---|---|---|---|
|
#18+
+1 За то чтобы делать на клиенте. По описанию это вообще обычный сводный отчет, возможно вам нужно просто выбрать "правильный" тип отчета в вашем reporting framework в c#. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2018, 21:03 |
|
||
|
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
|
|||
|---|---|---|---|
|
#18+
Большое спасибо за ответы! Remindно нафиг такой гемор творить на стороне SQL - не совсем понятно Честно говоря, думал побыстрее работать будет. Конечно, когда речь идёт об одной группе и одном месяце - говорить о производительности смешно. Но если нужно в масштабах учебного центра сделать отчёт - 40 групп за год, скажем.. PIVOT вообще не в курсе - буду гуглить.. Andy_OLAP Хотя бы потом, что пересечение ученика и даты может дать несколько разных записей в Lessons - и я никак не пойму, почему Вы в ведомости рисуете 0 и 1. А если уроков должно было быть 5, а ученик посетил только 4? Или Вам нужно, чтобы он посетил хотя бы один урок из выбранной даты? На самом деле, может быть название Visits не совсем корректно по смыслу. Имеется ввиду статус занятия для данного ученика: Null - не заполнено, 0 - отсутствовал, 1 - присутствовал.. там ещё будет статусы: оплачиваемый пропуск, неоплачиваемый и много чего ещё. Записи в Visits генерируются автоматически при появлении записи в таблице Lessons, для каждого клиента, привязанного к данной группе. И дальше неважно, пока его "не отвязать", записи для него генерятся, хоть даже его ни разу не было на занятии. Наверное немного путанно объяснил.. С cross join поэкспериментирую обязательно. Владимир_Затуливетер По описанию это вообще обычный сводный отчет, возможно вам нужно просто выбрать "правильный" тип отчета в вашем reporting framework в c#. Большое спасибо за наводку. В с# я пока тоже не гуру далеко )). Думал "ручками" делать. Буду смотреть! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2018, 21:47 |
|
||
|
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
|
|||
|---|---|---|---|
|
#18+
eonae, Пусть в группе 30 человек, в месяце 30 дней, т.е. из таблицы Visits нужно взять 30*30=900 строк и развернуть. Пусть еще и 40 групп. Если это гемор, то что тогда не гемор? С одной строны " Status [bit] NOT NULL) -- 0 - не был, 1 - был ", с другой стороны " Null - не заполнено, 0 - отсутствовал, 1 – присутствовал " " Записи в Visits генерируются автоматически при появлении записи в таблице Lessons, для каждого клиента, привязанного к данной группе ". Действительно, "немного путанно", Lessons – это расписание занятий, формируется один раз в начале семестра, с возможной коррекцией в течение семестра, а Visits заполняется после каждого занятия в соответствии с реальной посещаемостью. Не важно каким способом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2018, 14:30 |
|
||
|
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
|
|||
|---|---|---|---|
|
#18+
eonaeИ из этих данных необходимо получить ведомость посещения с за определённый месяц и в определённой группе примерно такого вида: Отчет всегда будет выдаваться за календарный месяц? Или возможна выборка за несколько месяцев? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2018, 14:46 |
|
||
|
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
|
|||
|---|---|---|---|
|
#18+
Wlr-lПусть в группе 30 человек, в месяце 30 дней, т.е. из таблицы Visits нужно взять 30*30=900 строк и развернуть. Пусть еще и 40 групп. Если это гемор, то что тогда не гемор? Для меня гемор - это решать задачи тулзами, которые для этого не предназначены. Да пусть там хоть 1 строка, писать динамический pivot ради этого считаю нецелесообразным. Это как решать data science задачи на чистом T-SQL без использования python и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2018, 17:37 |
|
||
|
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
|
|||
|---|---|---|---|
|
#18+
RemindОднозначно делать на стороне клиента. Можете и на стороне SQL Server'a, конечно, PIVOT вам в помощь. Просто вы наверняка захотите dynamic pivot, это тоже возможно, но нафиг такой гемор творить на стороне SQL - не совсем понятно. можно не динамический, а вполне статический, если "необходимо получить ведомость посещения с за определённый месяц и в определённой группе" да и группу, можно отображать, при желании пример с тестовыми данными внизу идея в том, чтобы выдавать пивотом посещения за следующие 31 день, начиная с интересующей даты функция Код: sql 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. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. пример вызова и результат Код: sql 1. monthclient01234567891011121314151617181920212223242526272829302018-01-01 00:00:00Alex11011011100001101110011101011112018-01-01 00:00:00Irene11100110001010110110110101100112018-01-01 00:00:00John10111111000011001100011101110002018-01-01 00:00:00Mary11111001011010111010101111100012018-01-01 00:00:00Piter1011001110101101111000011011110 Код: sql 1. monthclient01234567891011121314151617181920212223242526272829302018-02-01 00:00:00Alex0110111011NULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULL2018-02-01 00:00:00Irene1010110011NULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULL2018-02-01 00:00:00John0100100010NULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULL2018-02-01 00:00:00Mary0011110111NULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULL2018-02-01 00:00:00Piter1011011110NULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULL * столбцы 0..30 - это кол-во дней вперед от переданной даты, т.е. 0 - переданная дата, 1 - следующий день и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2018, 18:42 |
|
||
|
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
|
|||
|---|---|---|---|
|
#18+
В итоге сделал всё-таки на c#. Работает хорошо, вполне быстро даже при выгрузке всей информации за год. Но за новый импульс в изучении sql всем большое спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2018, 10:46 |
|
||
|
Нетривиальный запрос. Хранение и выборка данных о посещениях в уч. заведении.
|
|||
|---|---|---|---|
|
#18+
RemindWlr-lПусть в группе 30 человек, в месяце 30 дней, т.е. из таблицы Visits нужно взять 30*30=900 строк и развернуть. Пусть еще и 40 групп. Если это гемор, то что тогда не гемор? Для меня гемор - это решать задачи тулзами, которые для этого не предназначены. Да пусть там хоть 1 строка, писать динамический pivot ради этого считаю нецелесообразным. Это как решать data science задачи на чистом T-SQL без использования python и т.п. Пример статического запроса уже привели. Приведу пример динамического запроса: Код: sql 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. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. Для мышки(Wlr-l) кошка (python) страшнее зверя нет! Проблема использования тех или иных языков для решения тех или иных задач сводится к известной проблеме Мастера и подмастерья. Мастер с помощью молотка и зубила (чистый T-SQL) может сделать то, что подмастерье не сможет сделать даже с помощью станков (python). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2018, 14:36 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=139&tid=1689295]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
36ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 314ms |

| 0 / 0 |
