Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.2.15] |
|
Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Здравствуйте! Столкнулся с проблемой, не могу доделать запрос.
Запрос: SELECT peoples.Name,1,2 FROM marks,subjects_classes,peoples WHERE marks.SubjectID=subjects_classes.SubjectID and peoples.ClassesID=subjects_classes.ClassID and subjects_classes.ClassID='1916c65b-8631-11e6-b7b6-000c29065d4c' and subjects_classes.SubjectID='c8a296f6-8621-11e6-b7b6-000c29065d41' and marks.AddedDate between STR_TO_DATE('01.09.2016','%d.%m.%Y %H:%i:%s') and STR_TO_DATE('30.09.2016','%d.%m.%Y %H:%i:%s') Результат: Прикреплённый файл____________.png (1,37 Кбайт, скачиваний: 425) Должно быть: Прикреплённый файлClassJornal.png (6,49 Кбайт, скачиваний: 415) Сама база вид: Прикреплённый файл________.png (161,92 Кбайт, скачиваний: 426) |
Сообщ.
#2
,
|
|
|
Напиши человеческим языком - че нужно получить.
Добавлено Все ID и ссылки имеют тип GUID??? |
Сообщ.
#3
,
|
|
|
Нет все ID имеют тип string.
Добавлено ClassJournal.png тот результат что я должен получить. |
Сообщ.
#4
,
|
|
|
Цитата Dmitriy78781 @ ClassJournal.png тот результат что я должен получить. Ну тогда вопросы: 1) Не совсем понятно, а что есть 25 колонок? Если это дни месяца, вероятно их должно быть 28-31 2) А если это действительно дни месяца, то какой смысл указывать диапазон дат? Нужно указать месяц и год* 3) Что выводить, если ученик по предмету получит в день несколько оценок (например, контрольная работа и устный ответ)? * или дату, относительно которой считается месяц+год |
Сообщ.
#5
,
|
|
|
Я когда делал скриншет, то нечайно обрезал часть вывода, 31 колонка. По заданию ученик получит только одну оценку в течении урока. Аналогия со школьным журналом.
|
Сообщ.
#6
,
|
|
|
Вариант (правда там ID числовые):
SELECT Q.Name, CASE WHEN Q.F1 = 0 THEN "-" ELSE Q.F1 END AS "1", CASE WHEN Q.F2 = 0 THEN "-" ELSE Q.F2 END AS "2", CASE WHEN Q.F3 = 0 THEN "-" ELSE Q.F3 END AS "3", CASE WHEN Q.F4 = 0 THEN "-" ELSE Q.F4 END AS "4", CASE WHEN Q.F5 = 0 THEN "-" ELSE Q.F5 END AS "5", CASE WHEN Q.F6 = 0 THEN "-" ELSE Q.F6 END AS "6", CASE WHEN Q.F7 = 0 THEN "-" ELSE Q.F7 END AS "7", CASE WHEN Q.F8 = 0 THEN "-" ELSE Q.F8 END AS "8", CASE WHEN Q.F9 = 0 THEN "-" ELSE Q.F9 END AS "9", CASE WHEN Q.F10 = 0 THEN "-" ELSE Q.F10 END AS "10", CASE WHEN Q.F11 = 0 THEN "-" ELSE Q.F11 END AS "11", CASE WHEN Q.F12 = 0 THEN "-" ELSE Q.F12 END AS "12", CASE WHEN Q.F13 = 0 THEN "-" ELSE Q.F13 END AS "13", CASE WHEN Q.F14 = 0 THEN "-" ELSE Q.F14 END AS "14", CASE WHEN Q.F15 = 0 THEN "-" ELSE Q.F15 END AS "15", CASE WHEN Q.F16 = 0 THEN "-" ELSE Q.F16 END AS "16", CASE WHEN Q.F17 = 0 THEN "-" ELSE Q.F17 END AS "17", CASE WHEN Q.F18 = 0 THEN "-" ELSE Q.F18 END AS "18", CASE WHEN Q.F19 = 0 THEN "-" ELSE Q.F19 END AS "19", CASE WHEN Q.F20 = 0 THEN "-" ELSE Q.F20 END AS "20", CASE WHEN Q.F21 = 0 THEN "-" ELSE Q.F21 END AS "21", CASE WHEN Q.F22 = 0 THEN "-" ELSE Q.F22 END AS "22", CASE WHEN Q.F23 = 0 THEN "-" ELSE Q.F23 END AS "23", CASE WHEN Q.F24 = 0 THEN "-" ELSE Q.F24 END AS "24", CASE WHEN Q.F25 = 0 THEN "-" ELSE Q.F25 END AS "25", CASE WHEN Q.F26 = 0 THEN "-" ELSE Q.F26 END AS "26", CASE WHEN Q.F27 = 0 THEN "-" ELSE Q.F27 END AS "27", CASE WHEN Q.F28 = 0 THEN "-" ELSE Q.F28 END AS "28", CASE WHEN Q.F29 = 0 THEN "-" ELSE Q.F29 END AS "29", CASE WHEN Q.F30 = 0 THEN "-" ELSE Q.F30 END AS "30", CASE WHEN Q.F31 = 0 THEN "-" ELSE Q.F31 END AS "31" FROM ( SELECT Peoples.Name, SUM(CASE WHEN DAY(Marks.AddedDate) = 1 THEN Marks.Mark ELSE 0 END) AS "F1", SUM(CASE WHEN DAY(Marks.AddedDate) = 2 THEN Marks.Mark ELSE 0 END) AS "F2", SUM(CASE WHEN DAY(Marks.AddedDate) = 3 THEN Marks.Mark ELSE 0 END) AS "F3", SUM(CASE WHEN DAY(Marks.AddedDate) = 4 THEN Marks.Mark ELSE 0 END) AS "F4", SUM(CASE WHEN DAY(Marks.AddedDate) = 5 THEN Marks.Mark ELSE 0 END) AS "F5", SUM(CASE WHEN DAY(Marks.AddedDate) = 6 THEN Marks.Mark ELSE 0 END) AS "F6", SUM(CASE WHEN DAY(Marks.AddedDate) = 7 THEN Marks.Mark ELSE 0 END) AS "F7", SUM(CASE WHEN DAY(Marks.AddedDate) = 8 THEN Marks.Mark ELSE 0 END) AS "F8", SUM(CASE WHEN DAY(Marks.AddedDate) = 9 THEN Marks.Mark ELSE 0 END) AS "F9", SUM(CASE WHEN DAY(Marks.AddedDate) = 10 THEN Marks.Mark ELSE 0 END) AS "F10", SUM(CASE WHEN DAY(Marks.AddedDate) = 11 THEN Marks.Mark ELSE 0 END) AS "F11", SUM(CASE WHEN DAY(Marks.AddedDate) = 12 THEN Marks.Mark ELSE 0 END) AS "F12", SUM(CASE WHEN DAY(Marks.AddedDate) = 13 THEN Marks.Mark ELSE 0 END) AS "F13", SUM(CASE WHEN DAY(Marks.AddedDate) = 14 THEN Marks.Mark ELSE 0 END) AS "F14", SUM(CASE WHEN DAY(Marks.AddedDate) = 15 THEN Marks.Mark ELSE 0 END) AS "F15", SUM(CASE WHEN DAY(Marks.AddedDate) = 16 THEN Marks.Mark ELSE 0 END) AS "F16", SUM(CASE WHEN DAY(Marks.AddedDate) = 17 THEN Marks.Mark ELSE 0 END) AS "F17", SUM(CASE WHEN DAY(Marks.AddedDate) = 18 THEN Marks.Mark ELSE 0 END) AS "F18", SUM(CASE WHEN DAY(Marks.AddedDate) = 19 THEN Marks.Mark ELSE 0 END) AS "F19", SUM(CASE WHEN DAY(Marks.AddedDate) = 20 THEN Marks.Mark ELSE 0 END) AS "F20", SUM(CASE WHEN DAY(Marks.AddedDate) = 21 THEN Marks.Mark ELSE 0 END) AS "F21", SUM(CASE WHEN DAY(Marks.AddedDate) = 22 THEN Marks.Mark ELSE 0 END) AS "F22", SUM(CASE WHEN DAY(Marks.AddedDate) = 23 THEN Marks.Mark ELSE 0 END) AS "F23", SUM(CASE WHEN DAY(Marks.AddedDate) = 24 THEN Marks.Mark ELSE 0 END) AS "F24", SUM(CASE WHEN DAY(Marks.AddedDate) = 25 THEN Marks.Mark ELSE 0 END) AS "F25", SUM(CASE WHEN DAY(Marks.AddedDate) = 26 THEN Marks.Mark ELSE 0 END) AS "F26", SUM(CASE WHEN DAY(Marks.AddedDate) = 27 THEN Marks.Mark ELSE 0 END) AS "F27", SUM(CASE WHEN DAY(Marks.AddedDate) = 28 THEN Marks.Mark ELSE 0 END) AS "F28", SUM(CASE WHEN DAY(Marks.AddedDate) = 29 THEN Marks.Mark ELSE 0 END) AS "F29", SUM(CASE WHEN DAY(Marks.AddedDate) = 30 THEN Marks.Mark ELSE 0 END) AS "F30", SUM(CASE WHEN DAY(Marks.AddedDate) = 31 THEN Marks.Mark ELSE 0 END) AS "F31" FROM Peoples LEFT JOIN Marks ON Marks.PeopleID = Peoples.ID AND Marks.SubjectID = 1 AND -- какой предмет (тут подставить строку вместо числа) MONTH(Marks.AddedDate) = 10 AND -- за какой месяц YEAR(Marks.AddedDate) = 2016 -- за какой год WHERE Peoples.ClassesID = 1 -- какой класс (тут подставить строку вместо числа) GROUP BY Peoples.Name ) AS Q ORDER BY Q.Name |
Сообщ.
#7
,
|
|
|
Все работает спасибо!
|
Сообщ.
#8
,
|
|
|
Расти большой
|
Сообщ.
#9
,
|
|
|
А что если не использовать фун-цию sum
SUM(CASE WHEN DAY(Marks.AddedDate) = 1 THEN Marks.Mark ELSE 0 END) я попробовал sum без работает. |
Сообщ.
#10
,
|
|
|
Цитата Dmitriy78781 @ я попробовал sum без работает. Смысл sum в данном запросе - выловить одну оценку за один день по предмету. Однако, если в БД будет несколько оценок за день конкретному ученику по конкретному предмету - запрос отработает не верно (вернет сумму оценок за день). |
Сообщ.
#11
,
|
|
|
Хорошо, а если допустим в один день два урока одного предмета, то как быть?
Добавлено Как должен выглядеть запрос? |
Сообщ.
#12
,
|
|
|
Цитата Dmitriy78781 @ Как должен выглядеть запрос? Сперва нужно определить, а как будет выглядеть ответ. |
Сообщ.
#13
,
|
|
|
Скажем так же само, но только числа могут повторятся, но идти по порядку. 9 сентября самостоятельная и рядом 9 сентября контрольная.
|
Сообщ.
#14
,
|
|
|
Цитата Dmitriy78781 @ Скажем так же само, но только числа могут повторятся, но идти по порядку. 9 сентября самостоятельная и рядом 9 сентября контрольная. В таком случае содержимое ячеек нужно представлять строкой, иначе, если числами - количество столбцов будет плавать. Для "склейки" - агрегатную функцию SUM() заменить на GROUP_CONCAT(). Ну это так, теоретически, попробуй написать код сам. |
Сообщ.
#15
,
|
|
|
А можете подсказать какую-нибудь хорошую книгу по таким вот запросам?
|